Der Entwicklungsserver warnte bei jedem Start: „Package pg can't be external".
Die Ursache lag im Abhängigkeitsbaum - wir pinnten pg auf 8.13.1,
@prisma/adapter-pg verlangt ^8.16.3, also lagen zwei Kopien nebeneinander und
Next konnte pg nicht als extern behandeln. Unser Pin steht jetzt auf 8.23.0,
@types/pg entsprechend.
Damit wurde eine zweite Warnung sichtbar, gleiche Art: der generierte Client
verweist auf @prisma/client/runtime, und Next löst das aus dem
Projektverzeichnis auf - dort lag es aber nicht. @prisma/client ist jetzt auch
in web deklariert.
Beide Warnungen sind nachgeprüft weg, mit einem Dev-Server auf eigenem Port und
zwei Seitenaufrufen.
Nebenbei: Next hatte meine Wegwerf-Verzeichnisse von den Zeitmessungen
(.next-mess1 bis .next-pg2) in die include-Liste von web/tsconfig.json
geschrieben. Zurückgesetzt auf den ursprünglichen Stand.
Die Testläufe hatten dort 70 erfundene Rollen, 112 Nutzer und 40 Akten
hinterlassen. Die Rollenverwaltung zeigte deshalb "Gast" siebzehnmal, echte
Rollen doppelt und in willkürlicher Reihenfolge.
Aufräumen allein reicht nicht: CaseEntry, CaseEntryVersion und AuditLog lassen
sich nach harter Regel 2 nicht löschen. Was ein Test dort anlegt, bleibt für
immer stehen - in Phase 2 hätte das die Fallliste unbrauchbar gemacht.
Tests laufen deshalb gegen <datenbank>_test auf demselben Server. pnpm test legt
sie an, migriert und seedet sie vorher. Über TEST_DATABASE_URL lässt sich ein
anderes Ziel setzen.
Dazu die Abschnitte der Rollenverwaltung in der Reihenfolge, in der die
Abteilung ihre Rollen aufzählt: Ränge, Zugehörigkeit, Zugang. Innerhalb eines
Abschnitts entscheidet die Position auf dem Discord-Server, oben die höchste.
Damit steht die Hierarchie an einer Stelle, die ohnehin gepflegt wird.
pnpm-Workspace mit web/, worker/, pdf/ und packages/db. Das Datenbankpaket ist
eigenständig, weil Web-App und Worker denselben Prisma-Client brauchen.
Schema nach docs/04-datenmodell.md, mit drei Abweichungen, die dort begründet
sind: CaseParticipant bekommt einen eigenen Schlüssel statt eines
zusammengesetzten mit NULL-Spalten, die Aktenzeichen laufen über CaseCounter
statt über eine Sequenz pro Jahr, und ServiceHeartbeat kommt dazu, damit
/api/health den Gateway-Zustand kennt, ohne Discord zu fragen.
Die zweite Migration enthält, was Prisma nicht ausdrücken kann:
- kein DELETE auf CaseEntry, CaseEntryVersion und AuditLog
- authorId, createdAt, caseId und type eines Eintrags sind unveränderlich
- an einer Eintragsversion darf nur minClearance angehoben werden
- Volltextsuche mit deutscher Konfiguration; geschwärzte Bereiche werden vor
dem Indizieren entfernt, sonst verrät ein Treffer den Inhalt
- pg_notify bei Rollen- und Mapping-Änderungen
Acht Tests prüfen diese Regeln gegen eine echte Postgres-Instanz, nicht gegen
die Anwendungslogik.