Files
Harlekin 8f0644e053 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.
2026-09-01 00:01:29 +02:00

28 lines
839 B
TypeScript

import { existsSync } from 'node:fs'
import path from 'node:path'
import { defineConfig, env } from '@prisma/config'
// Prisma 7 lädt die .env nicht mehr selbst. Im Betrieb stehen die Werte
// bereits in der Umgebung (Dockge-Reiter), lokal kommen sie aus der Datei.
for (const candidate of [path.resolve('../../.env'), path.resolve('.env')]) {
if (existsSync(candidate)) {
process.loadEnvFile(candidate)
break
}
}
/**
* Migrationen laufen bewusst über DIRECT_DATABASE_URL, also an pgbouncer vorbei:
* im Transaktionsmodus überstehen sie den Pool nicht. Siehe docs/11-betrieb.md.
*/
export default defineConfig({
schema: path.join('prisma', 'schema.prisma'),
migrations: {
path: path.join('prisma', 'migrations'),
seed: 'tsx prisma/seed.ts',
},
datasource: {
url: env('DIRECT_DATABASE_URL'),
},
})