import 'server-only' import { PrismaClient } from '@prisma/client' /** * Prisma-Client als Singleton. * * Im Entwicklungsmodus laedt Next.js Module bei jeder Aenderung neu. Ohne * diesen Umweg ueber globalThis entstuende bei jedem Speichern eine neue * Verbindung, bis Postgres keine mehr annimmt. */ const globalFuerPrisma = globalThis as unknown as { prisma: PrismaClient | undefined } export const db = globalFuerPrisma.prisma ?? new PrismaClient({ log: process.env.NODE_ENV === 'development' ? [{ emit: 'stdout', level: 'warn' }, { emit: 'stdout', level: 'error' }] : [{ emit: 'stdout', level: 'error' }], }) if (process.env.NODE_ENV !== 'production') { globalFuerPrisma.prisma = db } /** * Standardfilter: Der Papierkorb wird ueberall ausgeblendet. Wer die * geloeschten Datensaetze sehen will, fragt sie ausdruecklich ab. */ export const nichtGeloescht = { geloeschtAm: null } as const /** * Stichtag, ab dem ein Datensatz im Papierkorb endgueltig entfernt wird. * 30 Tage - lang genug fuer ein "oh, das brauchte ich doch noch". */ export const PAPIERKORB_TAGE = 30 export function papierkorbGrenze(jetzt = new Date()): Date { const grenze = new Date(jetzt) grenze.setDate(grenze.getDate() - PAPIERKORB_TAGE) return grenze } /** * BigInt laesst sich nicht als JSON serialisieren. Server Components * reichen Daten an Client Components weiter - deshalb hier ein Helfer, * der Cent-Betraege auf dem Weg nach draussen in Number wandelt. * Cent-Betraege bis 90 Billionen Euro bleiben dabei exakt. */ export function centZuZahl(wert: bigint | null | undefined): number | null { if (wert === null || wert === undefined) return null if (wert > BigInt(Number.MAX_SAFE_INTEGER) || wert < BigInt(-Number.MAX_SAFE_INTEGER)) { throw new Error(`Betrag ${wert} liegt ausserhalb des sicher darstellbaren Bereichs.`) } return Number(wert) }