Pentest 64.1 LOW: ApiError-Klasse, Race-Lock liefert jetzt 400 statt 500
assertNoRecentDuplicateDocument warf einen generischen Error → die Catch-Blöcke in den drei ContractDocument-Schreibpfaden mappten das auf 500, obwohl es klar eine 400-Class-Situation (Caller-Fehler: Duplikat-Submit) ist. Neuer ApiError-Helper in utils/apiError: - ApiError(statusCode, message) – einfache Subklasse von Error mit explizitem HTTP-Status. assertNoRecentDuplicateDocument wirft jetzt ApiError(400, ...). Catch-Blöcke gehärtet (Service-Pattern: `error instanceof ApiError ? error.statusCode : <default>`): - contract.controller uploadContractDocument: 400-Default bleibt, ApiError wird honoriert; bonus: multer-Datei wird bei Reject jetzt gelöscht (war vorher orphaned bei Lock-Reject). - cachedEmail.controller saveEmailAsContractDocument: 500-Default, ApiError → 400. - cachedEmail.controller saveAttachmentAsContractDocument: dito. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
import cron from 'node-cron';
|
||||
import prisma from '../lib/prisma.js';
|
||||
import { createAuditLog, logChange } from './audit.service.js';
|
||||
import { ApiError } from '../utils/apiError.js';
|
||||
|
||||
async function runExpireCheck(): Promise<void> {
|
||||
const today = new Date();
|
||||
@@ -110,7 +111,9 @@ export async function assertNoRecentDuplicateDocument(
|
||||
select: { id: true },
|
||||
});
|
||||
if (recent) {
|
||||
throw new Error('Ein Dokument dieses Typs wurde vor wenigen Sekunden bereits angelegt – bitte kurz warten und Seite neu laden.');
|
||||
// Pentest 64.1: ApiError(400) statt generischem Error – Caller
|
||||
// mappt das auf 400 Bad Request statt pauschal 500.
|
||||
throw new ApiError(400, 'Ein Dokument dieses Typs wurde vor wenigen Sekunden bereits angelegt – bitte kurz warten und Seite neu laden.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user