59 lines
3.8 KiB
Markdown
59 lines
3.8 KiB
Markdown
# Fachliche Persistenzschnittstelle
|
|
|
|
Stand: 2026-07-17
|
|
Zugehörige Planphase: Phase 9
|
|
|
|
## Zweck
|
|
|
|
`AssessorRepository` ist die technische Vertrauensgrenze zwischen Fachlogik und dauerhafter Speicherung. Import-, Vergleichs- und Reviewlogik kennen weder SQL noch HTTP, SQLite oder PostgreSQL. Ein späteres Backend implementiert denselben Vertrag und kann Transaktionen intern mit PostgreSQL abbilden.
|
|
|
|
Die heutige `LocalAssessorRepository`-Implementierung hält Daten ausschließlich im Arbeitsspeicher. Sie ist eine ausführbare Referenz für Semantik und Vertragstests, keine dauerhafte Produktdatenbank. Die bestehende lokale App- und Snapshotablage bleibt bis zur Backendintegration unverändert nutzbar.
|
|
|
|
## Repository-Operationen
|
|
|
|
- Projekte und Assessments anlegen, ändern und auflisten
|
|
- vollständige kanonische Assessment-Modelle laden
|
|
- Finding-Vorkommen nach Projekt, Assessment, Scan-Lauf, Tool, Definition, Severity und Status abfragen
|
|
- Reviews mit optimistischer Revisionsprüfung aktualisieren
|
|
- aktive Profilversionen registrieren
|
|
- bestätigte lokale Vergleichsregeln speichern und laden
|
|
- Vergleichsergebnisse speichern und abfragen
|
|
- vollständige Projektdaten kontrolliert exportieren
|
|
- Projekte nur nach exakter Kaskadenbestätigung löschen
|
|
|
|
Alle zurückgegebenen Objekte sind Kopien. Aufrufer können dadurch keinen gespeicherten Zustand außerhalb der Repository-Operationen verändern.
|
|
|
|
## Importtransaktion
|
|
|
|
Eine Importsitzung umfasst genau einen neuen Scan-Lauf und alle zugehörigen Objekte:
|
|
|
|
1. `beginImport` prüft Projekt, Assessment, Scan-ID und Scan-Reihenfolge.
|
|
2. `stage` sammelt Importdateien, Quelltabellen, Definitionen, Vorkommen, Evidenz und Diagnosen, ohne sie für Abfragen sichtbar zu machen.
|
|
3. `commit` prüft, dass sämtliche Querverweise zur gleichen Sitzung gehören, baut das vollständige kanonische Assessment-Modell auf und validiert es.
|
|
4. Erst nach erfolgreicher Gesamtvalidierung wird der Repository-Zustand atomar ersetzt.
|
|
5. `rollback` verwirft sämtliche gestagten Daten.
|
|
|
|
Jede Sitzung merkt sich die Repository-Revision bei ihrem Start. Wurde das Repository zwischenzeitlich verändert, schlägt der Commit mit einem Konflikt fehl. Dadurch überschreibt ein veralteter Import keine neueren Reviews, Profile oder parallelen Importe.
|
|
|
|
Ein fehlgeschlagener Commit bleibt rollbackfähig und hinterlässt weder Scan-Lauf noch Dateien oder Findings.
|
|
|
|
## Konflikte und Validierung
|
|
|
|
- doppelte Objekt-IDs erzeugen einen Konflikt,
|
|
- dieselbe Scan-Reihenfolge darf innerhalb eines Assessments nur einmal vorkommen,
|
|
- Dateien, Tabellen, Findings, Evidenz und Diagnosen dürfen keine Objekte außerhalb ihrer Importsitzung referenzieren,
|
|
- bestehende Finding-Definitionen dürfen aktualisiert, aber nicht auf einen widersprüchlichen kanonischen Schlüssel umgebogen werden,
|
|
- Reviewupdates benötigen die nächste Revision und können zusätzlich eine erwartete Vorversion angeben,
|
|
- Vergleiche dürfen nur Läufe und Findings ihres Assessments referenzieren,
|
|
- lokale Mappingregeln werden vor dem Speichern validiert.
|
|
|
|
## Export und Löschung
|
|
|
|
Der Projektexport enthält Assessments, Läufe, Importdateien, Tabellen, Definitionen, Vorkommen, Evidenz, Reviews, Diagnosen, Vergleiche und lokale Mappingregeln. Profilregistrierungen sind installationsweit und deshalb nicht Teil eines einzelnen Projektexports.
|
|
|
|
Eine Projektlöschung verlangt Projekt-ID und ausdrückliche Kaskadenbestätigung. Gelöscht werden alle ausschließlich zugehörigen Objekte. Finding-Definitionen, die weiterhin von einem anderen Projekt referenziert werden, bleiben erhalten.
|
|
|
|
## Übergang zu Backend und PostgreSQL
|
|
|
|
Phase 10 stellt den Repository-Vertrag über ein lokales Backend bereit. Der Browser spricht dann ausschließlich mit der Anwendungs-API. Phase 11 implementiert die Repository-Operationen und Importtransaktionen mit PostgreSQL-Migrationen. React erhält weder Datenbankzugangsdaten noch SQL.
|