Skip to content

Commit bc32349

Browse files
Add Rust CSV import flow
1 parent 97a32a4 commit bc32349

7 files changed

Lines changed: 520 additions & 13 deletions

File tree

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,12 @@ jobs:
7373
curl -fsS -b "$cookie_file" "$RUST_BACKEND_URL/api/v1/auth/session" >/dev/null
7474
curl -fsS -b "$cookie_file" "$RUST_BACKEND_URL/dashboard/" >/dev/null
7575
curl -fsS -b "$cookie_file" "$RUST_BACKEND_URL/admin/users/" >/dev/null
76+
curl -fsS -b "$cookie_file" "$RUST_BACKEND_URL/imports/" >/dev/null
7677
curl -fsS -b "$cookie_file" "$RUST_BACKEND_URL/api/v1/accounts/users" >/dev/null
7778
curl -fsS -b "$cookie_file" "$RUST_BACKEND_URL/api/v1/accounts/roles" >/dev/null
7879
curl -fsS -b "$cookie_file" "$RUST_BACKEND_URL/api/v1/accounts/groups" >/dev/null
7980
curl -fsS -b "$cookie_file" "$RUST_BACKEND_URL/api/v1/accounts/permissions" >/dev/null
81+
curl -fsS -b "$cookie_file" -H "content-type: application/json" -d '{"import_type":"business_units","replace_existing":false,"csv_data":"name\nRust Smoke Import"}' "$RUST_BACKEND_URL/api/v1/import-center/csv" >/dev/null
8082
curl -fsS -H "x-iscy-tenant-id: 1" -H "x-iscy-user-id: 1" "$RUST_BACKEND_URL/api/v1/catalog/domains" >/dev/null
8183
curl -fsS -H "x-iscy-tenant-id: 1" -H "x-iscy-user-id: 1" "$RUST_BACKEND_URL/api/v1/requirements" >/dev/null
8284
curl -fsS -H "x-iscy-tenant-id: 1" -H "x-iscy-user-id: 1" "$RUST_BACKEND_URL/api/v1/product-security/overview" >/dev/null

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,12 @@ rust-smoke:
8383
curl -fsS -b "$$cookie_file" "$$url/api/v1/auth/session" >/dev/null; \
8484
curl -fsS -b "$$cookie_file" "$$url/dashboard/" >/dev/null; \
8585
curl -fsS -b "$$cookie_file" "$$url/admin/users/" >/dev/null; \
86+
curl -fsS -b "$$cookie_file" "$$url/imports/" >/dev/null; \
8687
curl -fsS -b "$$cookie_file" "$$url/api/v1/accounts/users" >/dev/null; \
8788
curl -fsS -b "$$cookie_file" "$$url/api/v1/accounts/roles" >/dev/null; \
8889
curl -fsS -b "$$cookie_file" "$$url/api/v1/accounts/groups" >/dev/null; \
8990
curl -fsS -b "$$cookie_file" "$$url/api/v1/accounts/permissions" >/dev/null; \
91+
curl -fsS -b "$$cookie_file" -H "content-type: application/json" -d '{"import_type":"business_units","replace_existing":false,"csv_data":"name\nRust Smoke Import"}' "$$url/api/v1/import-center/csv" >/dev/null; \
9092
curl -fsS "$$url/dashboard/?tenant_id=1&user_id=1" >/dev/null; \
9193
curl -fsS -H "x-iscy-tenant-id: 1" -H "x-iscy-user-id: 1" "$$url/api/v1/catalog/domains" >/dev/null; \
9294
curl -fsS -H "x-iscy-tenant-id: 1" -H "x-iscy-user-id: 1" "$$url/api/v1/requirements" >/dev/null; \

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ make rust-test
8989
make rust-run
9090
```
9191

92-
Zusätzlich stellt `rust-backend` eine Rust-Weboberflächen-Route-Map für die bisherigen Django-Mountpoints bereit (z. B. `/dashboard/`, `/reports/`, `/admin/users/`, `/cves/`) als Migrationsgrundlage.
92+
Zusätzlich stellt `rust-backend` Rust-Weboberflächen für zentrale bisherige Django-Mountpoints bereit (z. B. `/dashboard/`, `/reports/`, `/imports/`, `/admin/users/`, `/cves/`) als Migrationsgrundlage.
9393

9494
## Vordefinierte Security-Template-Pakete (im Fragenkatalog)
9595

@@ -273,7 +273,7 @@ make rust-smoke
273273

274274
`make local-test` deckt aktuell die Basis-Gesundheitschecks, mandantenbezogene Report-Views und die Product-Security-Routen ab.
275275
`make team-test` ist der Legacy-Django-Kompatibilitaetscheck.
276-
`make rust-smoke` ist der Rust-only Betriebs-Smoke mit DB-Bootstrap, Healthcheck, Rust-Session-Cookie, Dashboard ohne Query-Kontext und zentralen API-Probes.
276+
`make rust-smoke` ist der Rust-only Betriebs-Smoke mit DB-Bootstrap, Healthcheck, Rust-Session-Cookie, Dashboard ohne Query-Kontext, Import-Center-CSV-Probe und zentralen API-Probes.
277277

278278
## Support-Matrix
279279

docs/RUST_CUTOVER_STATUS.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Stand: 2026-04-23
44

55
## Kurzfassung
66

7-
ISCY ist fachlich weit in Richtung Rust migriert, aber noch nicht sicher Python-frei. Der Rust-Axum-Service ist als Backend direkt startbar, lokale Starts laufen Rust-only, Rust kann eigene Session-Cookies aus Django-kompatiblen Passwort-Hashes oder DB-validierten Tenant-/User-Kontexten ausstellen, liest Rollen, Gruppen und Django-kompatible Permissions aus der Rust-DB-Schicht, und erzwingt schreibende Rollen fuer migrierte Write-Flows. Die Rust-Web-Shell ist aktiv und ersetzt die frueheren Platzhalter fuer Dashboard, Risks, Evidence, Reports, Roadmap, Assets, Processes und User-Administration durch serverseitig gerenderte, datengetriebene Seiten. Die Django-Schicht ist aber weiterhin fuer vollstaendige Browser-Workflows, Detail-/Form-Flows und einen Teil der Datei-/Import-Orchestrierung relevant.
7+
ISCY ist fachlich weit in Richtung Rust migriert, aber noch nicht sicher Python-frei. Der Rust-Axum-Service ist als Backend direkt startbar, lokale Starts laufen Rust-only, Rust kann eigene Session-Cookies aus Django-kompatiblen Passwort-Hashes oder DB-validierten Tenant-/User-Kontexten ausstellen, liest Rollen, Gruppen und Django-kompatible Permissions aus der Rust-DB-Schicht, und erzwingt schreibende Rollen fuer migrierte Write-Flows. Die Rust-Web-Shell ist aktiv und ersetzt die frueheren Platzhalter fuer Dashboard, Risks, Evidence, Reports, Roadmap, Assets, Processes, Imports und User-Administration durch serverseitig gerenderte, datengetriebene Seiten. Die Django-Schicht ist aber weiterhin fuer vollstaendige Browser-Workflows, Detail-/Form-Flows und einzelne Datei-/Upload-Orchestrierungen relevant.
88

99
Deshalb ist der finale Loeschschritt fuer Python noch nicht fachlich freigegeben. Python jetzt zu entfernen wuerde die Anwendung nicht abschliessen, sondern zentrale UI- und Betriebsfunktionen abschalten.
1010

@@ -51,7 +51,7 @@ Der alte Django-Runserver ist damit nicht mehr der lokale Standardpfad.
5151
- Dashboard-, Report-, Catalog-, Requirements-, Asset-, Process- und Assessment-Read-Flows.
5252
- Risk-Register Read-, Detail-, Create- und Update-Flows.
5353
- Evidence Read-/Detail-Flows und Evidence-Need-Sync.
54-
- Rust-Web-Shell mit Kontext-Formular sowie datengetriebenem Dashboard, Risk-Register, Evidence-Ueberblick, Reports, Roadmap, Assets und Processes.
54+
- Rust-Web-Shell mit Kontext-Formular sowie datengetriebenem Dashboard, Risk-Register, Evidence-Ueberblick, Reports, Roadmap, Assets, Imports und Processes.
5555
- Rust-DB-Admin-CLI mit `migrate`, `seed-demo` und `init-demo` fuer Rust-eigenen SQLite/PostgreSQL-Bootstrap der operativen Kern-Tabellen inklusive Product-Security sowie vollstaendigem Katalog-/Requirement-Seed.
5656
- Rust-Session-Schicht mit `iscy_auth_session`, `/api/v1/auth/sessions`, `/api/v1/auth/session`, Logout, Cookie/Bearer-Aufloesung, Django-kompatibler `pbkdf2_sha256`-Passwortpruefung und Web-Kontext ohne Query-Parameter.
5757
- Rust-RBAC-Grundlage mit `accounts_role`, `accounts_userrole`, Session-Rollencodes, Header-Rollen-Fallback und Schreibschutz fuer migrierte Write-Endpunkte.
@@ -60,16 +60,16 @@ Der alte Django-Runserver ist damit nicht mehr der lokale Standardpfad.
6060
- `start.sh` startet lokal Rust-only statt Django-runserver.
6161
- Roadmap Liste, Detail, Kanban, Task-Updates und Exportdaten.
6262
- Wizard Start-/Result-Flows.
63-
- Import-Center bestaetigte Importjobs.
63+
- Import-Center bestaetigte Importjobs plus Rust-CSV-API `/api/v1/import-center/csv` und Rust-Webroute `/imports/` fuer CSV-Importe von Business-Units, Prozessen, Lieferanten und Assets.
6464
- Product-Security Liste, Produktdetail, Roadmap, Task-Updates und Vulnerability-Updates.
6565
- Rust-only-/Strict-Guards fuer migrierte Backend-Schalter.
6666

6767
## Blocker vor Python-Loeschung
6868

69-
1. **Weboberflaeche:** Rust liefert fuer `/dashboard/`, `/risks/`, `/evidence/`, `/reports/`, `/roadmap/`, `/assets/` und `/processes/` bereits echte serverseitige Seiten. Die restlichen Views, Detail-/Form-Flows und Exporte liegen noch in Django-Templates und Django-Views.
69+
1. **Weboberflaeche:** Rust liefert fuer `/dashboard/`, `/risks/`, `/evidence/`, `/reports/`, `/roadmap/`, `/assets/`, `/imports/` und `/processes/` bereits echte serverseitige Seiten. Die restlichen Views, Detail-/Form-Flows und Exporte liegen noch in Django-Templates und Django-Views.
7070
2. **Auth, Sessions und Admin:** Rust-Sessions, Passwort-Login, Rollen-/Schreibrechte sowie Account-Administration fuer User/Rollen-/Gruppen-/Direktrechtewechsel sind vorhanden. Die Django-kompatiblen Tabellen fuer Gruppen, Permissions und User-Zuordnung sind gebootstrapped; vollstaendige Django-Admin-Paritaet ist noch nicht komplett ersetzt.
7171
3. **Migrations und Seeds:** Ein Rust-eigener Bootstrap fuer operative Kern-Tabellen inklusive Product-Security, Catalog und Requirements ist vorhanden. Einzelne historische Django-Schema-Details ausserhalb dieser Cutover-Slices sind noch nicht vollstaendig abgeloest.
72-
4. **Formulare und Uploads:** Validierung, Form-Flows, Evidence-Dateiuploads sowie CSV/XLSX-Import-Mapping sind noch teilweise Django-orchestriert.
72+
4. **Formulare und Uploads:** CSV-Importe fuer Business-Units, Prozesse, Lieferanten und Assets laufen direkt ueber Rust-Web/API. Evidence-Dateiuploads, XLSX-Importe und Mapping-Vorschauen sind noch teilweise Django-orchestriert.
7373
5. **Python-Dateien im Repo:** CI und lokaler Start sind Rust-first. Python/Django-Dateien bleiben noch als Legacy-Kompatibilitaet und muessen nach Abschluss von Auth/Web/Form-Flows gezielt entfernt werden.
7474

7575
## Naechster fachlich sinnvoller Cutover-Schritt
@@ -78,7 +78,7 @@ Der naechste Abschlussblock ist nicht mehr ein weiterer einzelner API-Endpunkt,
7878

7979
1. Letzte Admin-Paritaet in Rust finalisieren.
8080
2. Django-Templates durch Rust-Web oder ein separates Frontend auf Rust-API ersetzen.
81-
3. Upload-/Import-Dateifluss ohne Django bereitstellen.
81+
3. Evidence-Dateiuploads, XLSX-Importe und Mapping-Vorschauen ohne Django bereitstellen.
8282
4. Python-Dateien, Requirements, Django-Settings und Django-Startpfade entfernen.
8383

8484
## Cutover-Entscheidung

docs/RUST_REWRITE_ROADMAP.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ ISCY schrittweise von Django/Python auf Rust ueberfuehren, ohne Fachfunktionalit
9595
- Django kann Wizard-Start und Ergebnisansicht ueber `WIZARD_RESULTS_BACKEND=rust_service` aus Rust lesen und im Nicht-Strict-Modus auf lokale ORM-Daten zurueckfallen
9696
- `import_center` hat tenantgeschuetzte Importjob-Writes in Rust:
9797
- `POST /api/v1/import-center/jobs` legt gemappte Business-Units, Prozesse, Lieferanten und Assets an oder aktualisiert sie; optional ersetzt es vorhandene Eintraege dieses Typs
98-
- Django behaelt Datei-Upload, CSV/XLSX-Parsing und Mapping-Vorschau, uebergibt den bestaetigten Import aber ueber `IMPORT_CENTER_BACKEND=rust_service` an Rust
98+
- `POST /api/v1/import-center/csv` parst CSV direkt in Rust und wendet Business-Unit-, Prozess-, Lieferanten- und Asset-Importe tenantgeschuetzt an
99+
- `/imports/` stellt den CSV-Import als Rust-Webformular bereit
100+
- Django behaelt nur noch Datei-/XLSX-Upload und Mapping-Vorschau fuer nicht migrierte Importvarianten
99101
- `product_security` hat tenantgeschuetzte Read-APIs in Rust:
100102
- `GET /api/v1/product-security/overview` liefert Product-Security-Matrix, Posture-Kennzahlen, Produktliste und letzte Snapshots fuer den aktuellen Tenant
101103
- `GET /api/v1/product-security/products/{product_id}` liefert den Detailbaum mit Releases, Komponenten, Threat Models, TARAs, Schwachstellen, AI-Systemen, PSIRT, Advisories, Snapshot und Roadmap-Aufgaben

0 commit comments

Comments
 (0)