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. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
28 lines
839 B
TypeScript
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'),
|
|
},
|
|
})
|