Files
AfiS-Aktensystem/packages/db/src/index.ts
T
HarlekinandClaude Opus 5 9c966b471e Tests schreiben nicht mehr in die Entwicklungsdatenbank
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.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 21:11:40 +02:00

41 lines
1.4 KiB
TypeScript

import { PrismaClient } from './generated/client.js'
import { PrismaPg } from '@prisma/adapter-pg'
import { loadEnvFromRepoRoot } from './loadEnv.js'
/**
* Der Client wird von Prisma als ECMAScript-Module nach `src/generated`
* erzeugt (siehe prisma/schema.prisma) und von dort mitübersetzt. Dadurch
* lässt er sich sauber weiterreichen, Enums inklusive, und er überlebt das
* Bündeln der Container-Images.
*/
export * from './generated/client.js'
export { loadEnvFromRepoRoot }
export { resolveTestDatabaseUrl, switchToTestDatabase } from './testDatabase.js'
/**
* Erzeugt einen Prisma-Client.
*
* Prisma 7 spricht über einen Treiber-Adapter statt über eine eigene
* Rust-Engine. Das passt hier doppelt: der `pg`-Treiber wird für
* LISTEN/NOTIFY ohnehin gebraucht (siehe docs/06-chat-und-realtime.md), und
* die Container-Images kommen ohne nachzuladende Binärdatei aus.
*
* Im Betrieb zeigt DATABASE_URL auf pgbouncer im Transaktionsmodus, deshalb
* gehören `pgbouncer=true` und ein kleines Pool-Limit in die URL.
* Siehe docs/09-performance-und-ux.md und docs/11-betrieb.md.
*/
export function createPrismaClient(url?: string): PrismaClient {
if (!url) {
loadEnvFromRepoRoot()
url = process.env.DATABASE_URL
}
if (!url) throw new Error('Konfiguration unvollständig: DATABASE_URL fehlt')
const adapter = new PrismaPg({ connectionString: url })
return new PrismaClient({
adapter,
log: ['warn', 'error'],
})
}