refactor(quick-260921-m34): Aufgabe 3a - 18 Fehlerfaenger auf unknown, mit echter Eingrenzung
catch (e: any) in groups, module-grants, ldap, user, admin-seed, calendar
und vier tenders-Diensten auf catch (e: unknown) umgestellt. Die
Eingrenzung passiert an der Verwendungsstelle, nicht per Zusicherung.
Neu: apps/api/src/prisma/prisma-error.ts mit prismaErrorCode() und
prismaErrorTarget(). Bewusst Form-Pruefungen statt instanceof
Prisma.PrismaClientKnownRequestError - gemessen: samtliche Testdoppel in
apps/api werfen new Error(...) mit angehaengtem .code (groups, user, ldap,
tenders, module-grants, admin-seed) und dashboard.service.spec.ts:451 ein
reines { code: 'P2002' }. Ein instanceof-Test haette all diese Werte in den
anderen Zweig geschickt - Verhaltensaenderung, verboten nach D-03/T-M34-06.
Die Helfer bilden err?.code und err?.meta?.target eins zu eins ab.
ldap.service.ts liest zusaetzlich meta.target; prismaErrorTarget() gibt
unknown zurueck, weil der Bestand dort Array UND Zeichenkette getrennt
behandelt - ein engerer Typ waere eine Behauptung.
calendar.service.ts:341 nutzt instanceof Error statt e?.message: gemessen
wirft validateUrlNotPrivate() ausschliesslich ForbiddenException (der
eigene catch dort setzt jeden Fremdfehler in eine um), also trifft
instanceof dieselben Faelle. Ersatzzweig 'URL not allowed' unveraendert.
noExplicitAny in apps/api/src: 56 -> 38. type-check 4/4, lint 5/5 (0
error), apps/api 72/1143, apps/web 73/531, rls-access-inventory 30/30.
noNonNullAssertion 56, as unknown as 33, Unterdrueckungsmarker 1.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TPPB4ApQxzSU1rwV2Ffj9J
This commit is contained in:
@@ -2,6 +2,7 @@ import { Injectable, Logger } from '@nestjs/common';
|
||||
import { Client, EqualityFilter, Entry } from 'ldapts';
|
||||
import { PrismaService } from '../prisma/prisma.service';
|
||||
import { forTenant } from '../prisma/prisma-tenant.extension';
|
||||
import { prismaErrorCode, prismaErrorTarget } from '../prisma/prisma-error';
|
||||
import { GroupsService } from '../groups/groups.service';
|
||||
import { UserService } from '../user/user.service';
|
||||
|
||||
@@ -842,9 +843,9 @@ export class LdapService {
|
||||
data: { tenantId, name, ldapDn: entry.dn, ldapObjectGuid },
|
||||
});
|
||||
result.imported++;
|
||||
} catch (createError: any) {
|
||||
if (createError?.code === 'P2002') {
|
||||
const target = createError?.meta?.target;
|
||||
} catch (createError: unknown) {
|
||||
if (prismaErrorCode(createError) === 'P2002') {
|
||||
const target = prismaErrorTarget(createError);
|
||||
const targetsGuid = Array.isArray(target)
|
||||
? target.includes('ldapObjectGuid')
|
||||
: String(target ?? '').includes('ldapObjectGuid');
|
||||
@@ -1526,8 +1527,8 @@ export class LdapService {
|
||||
data: { name, ldapDn: dn },
|
||||
});
|
||||
result.groupsRenamed++;
|
||||
} catch (updateError: any) {
|
||||
if (updateError?.code === 'P2002') {
|
||||
} catch (updateError: unknown) {
|
||||
if (prismaErrorCode(updateError) === 'P2002') {
|
||||
// WR-02 (16-REVIEW.md): this update() writes BOTH name and
|
||||
// ldapDn in one call — @@unique([tenantId, name]) AND
|
||||
// @@unique([tenantId, ldapDn]) are both potential triggers
|
||||
@@ -1535,7 +1536,7 @@ export class LdapService {
|
||||
// collision when updateError.meta.target says so. Mirrors
|
||||
// the discrimination importGroupsByDn() already does above
|
||||
// for its own create() call.
|
||||
const target = updateError?.meta?.target;
|
||||
const target = prismaErrorTarget(updateError);
|
||||
const targetsName = Array.isArray(target)
|
||||
? target.includes('name')
|
||||
: String(target ?? '').includes('name');
|
||||
@@ -1591,8 +1592,8 @@ export class LdapService {
|
||||
await tenantPrisma.group.delete({ where: { id: group.id } });
|
||||
result.groupsDeleted++;
|
||||
anyDeleted = true;
|
||||
} catch (deleteError: any) {
|
||||
if (deleteError?.code !== 'P2025') {
|
||||
} catch (deleteError: unknown) {
|
||||
if (prismaErrorCode(deleteError) !== 'P2025') {
|
||||
throw deleteError;
|
||||
}
|
||||
// Already gone (e.g. a concurrent manual delete) — not
|
||||
|
||||
Reference in New Issue
Block a user