/** * Eingrenzung gefangener Fehlerwerte auf die Form, die der Bestandscode an * Prisma-Fehlern tatsaechlich liest — `code` und `meta.target`, sonst nichts. * * Warum kein `instanceof Prisma.PrismaClientKnownRequestError`: * Der Bestand prueft ueberall `err?.code === 'P2002'` und trifft damit JEDES * Objekt, das ein `code`-Feld traegt. Genau darauf bauen die Testdoppel in * `apps/api` auf — sie werfen `const err = new Error(...); err.code = 'P2002'` * (groups, user, ldap, tenders, module-grants, admin-seed) und an einer Stelle * ein reines `{ code: 'P2002' }` (dashboard.service.spec.ts:451). Ein * `instanceof`-Test wuerde alle diese Werte in den jeweils ANDEREN Zweig * schicken. Das waere eine Verhaltensaenderung und ist deshalb verboten * (Plan 260921-m34, D-03 und T-M34-06). * * Diese Funktionen sind daher bewusst Form-Pruefungen ("duck typing") und * keine Klassenpruefungen: sie bilden `err?.code` bzw. `err?.meta?.target` * eins zu eins ab, nur eben ohne `any`. */ /** * Liefert den Prisma-Fehlercode (z.B. `P2002`, `P2025`), wenn der gefangene * Wert ein Objekt mit einem Zeichenketten-Feld `code` ist — sonst `undefined`. * * Ein Feld `code`, das keine Zeichenkette ist, liefert `undefined`. Auch das * ist verhaltensgleich: ein Vergleich `err.code === 'P2002'` waere dort * ohnehin nie wahr geworden. */ export function prismaErrorCode(err: unknown): string | undefined { if (typeof err !== 'object' || err === null) return undefined; const code = (err as { code?: unknown }).code; return typeof code === 'string' ? code : undefined; } /** * Liefert `meta.target` eines Prisma-Fehlers als `unknown`. * * Bewusst `unknown` und nicht `string[]`: Prisma liefert hier je nach * Fehlerart ein Feld-Array ODER den Indexnamen als Zeichenkette, und der * Bestand in `ldap.service.ts` behandelt genau diese beiden Faelle bereits * getrennt (`Array.isArray(target) ? ... : String(target ?? '')`). Ein * engerer Rueckgabetyp waere hier eine Behauptung statt einer Messung. */ export function prismaErrorTarget(err: unknown): unknown { if (typeof err !== 'object' || err === null) return undefined; const meta = (err as { meta?: unknown }).meta; if (typeof meta !== 'object' || meta === null) return undefined; return (meta as { target?: unknown }).target; }