Workspace und Datenmodell
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.
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
import { existsSync } from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
/**
|
||||
* Prisma 7 liest die .env nicht mehr von selbst, und der Seed läuft außerhalb
|
||||
* von Next.js. Im Betrieb kommen die Werte aus dem .env-Reiter von Dockge und
|
||||
* stehen längst in der Umgebung, dann passiert hier nichts.
|
||||
* Node 22 bringt loadEnvFile mit, dafür braucht es kein Paket.
|
||||
*/
|
||||
export function loadEnvFromRepoRoot(): void {
|
||||
const here = path.dirname(fileURLToPath(import.meta.url))
|
||||
for (const candidate of [
|
||||
path.resolve(here, '../../../.env'),
|
||||
path.resolve(here, '../../.env'),
|
||||
path.resolve(process.cwd(), '.env'),
|
||||
]) {
|
||||
if (existsSync(candidate)) {
|
||||
process.loadEnvFile(candidate)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user