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>
41 lines
1.4 KiB
TypeScript
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'],
|
|
})
|
|
}
|