feat(datenbank): Datenmodell für Anmeldung, Bereiche und Audit

Benutzer mit Rolle, OIDC-Konten, Sitzungen, Passkeys samt kurzlebiger
WebAuthn-Herausforderung, Bereiche mit Tageskapazität und Arbeitsfenster
sowie ein unveränderlicher Audit-Eintrag je schreibender Aktion.

Aufgabe und Zeitblock kommen mit M2 und M4, Kalenderkonto mit M3 — dann
mit den Feldern, die der jeweilige Provider wirklich braucht.

Prisma 7 nimmt die Verbindung nicht mehr aus dem Schema entgegen: die URL
steht in prisma.config.ts, der Client bekommt den pg-Treiberadapter.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-10 12:41:29 +02:00
co-authored by Claude Opus 5
parent de1f923767
commit 748d032f70
5 changed files with 396 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
import 'server-only'
import { PrismaPg } from '@prisma/adapter-pg'
import { PrismaClient } from '@/generated/prisma/client'
/**
* Ein einziger Prisma-Client je Prozess. Im Entwicklungsbetrieb ueberlebt er
* das Neuladen der Module, damit nicht bei jedem Speichern ein neuer
* Verbindungspool entsteht.
*/
const globalerBereich = globalThis as unknown as {
prisma: PrismaClient | undefined
}
function erzeugen(): PrismaClient {
const verbindung = process.env.DATABASE_URL
if (!verbindung) {
throw new Error('DATABASE_URL ist nicht gesetzt.')
}
const adapter = new PrismaPg({ connectionString: verbindung })
return new PrismaClient({
adapter,
log: process.env.NODE_ENV === 'development' ? ['warn', 'error'] : ['error'],
})
}
export const db: PrismaClient = globalerBereich.prisma ?? erzeugen()
if (process.env.NODE_ENV !== 'production') {
globalerBereich.prisma = db
}