import 'server-only' import type { Prisma } from '@/generated/prisma/client' import { auditDetails } from '@/lib/audit' import { db } from '@/server/db' import { aktuelleInstanz } from '@/server/instanz' /** * Nachweis jeder schreibenden Aktion. Die Details werden vorher gesaeubert * (siehe @/lib/audit), damit keine Geheimnisse in der Datenbank landen. */ export type AuditAkteur = { id: string | null email: string } export type AuditEingabe = { akteur: AuditAkteur /** Was geschah, in der Form "objekt.verb", z. B. "bereich.angelegt". */ aktion: string objektTyp: string objektId?: string | null details?: Record | undefined } /** * Schreibt einen Audit-Eintrag. Schlaegt das fehl, darf die eigentliche * Aktion nicht als geglueckt gelten – deshalb wird der Fehler weitergereicht * und nicht verschluckt. */ export async function auditSchreiben(eingabe: AuditEingabe): Promise { const details = auditDetails(eingabe.details) await db.auditEintrag.create({ data: { benutzerId: eingabe.akteur.id, benutzerEmail: eingabe.akteur.email, aktion: eingabe.aktion, objektTyp: eingabe.objektTyp, objektId: eingabe.objektId ?? null, ...(details ? { details: details as Prisma.InputJsonObject } : {}), instanz: aktuelleInstanz(), }, }) }