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:
@@ -9,6 +9,7 @@ import { fetchAttachment, appendToSent, ImapCredentials } from '../services/imap
|
||||
import { getImapSmtpSettings } from '../services/emailProvider/emailProviderService.js';
|
||||
import { decrypt } from '../utils/encryption.js';
|
||||
import { sanitizeNotes, stripHtml, validateContractDocumentType, validateOptionalIsoDate } from '../utils/sanitize.js';
|
||||
import { ApiError } from '../utils/apiError.js';
|
||||
import { logChange } from '../services/audit.service.js';
|
||||
import { ApiResponse, AuthRequest } from '../types/index.js';
|
||||
import { getCustomerTargets, getContractTargets, getIdentityDocumentTargets, getBankCardTargets, documentTargets } from '../config/documentTargets.config.js';
|
||||
@@ -1914,8 +1915,11 @@ export async function saveEmailAsContractDocument(req: AuthRequest, res: Respons
|
||||
res.json({ success: true, data: doc } as ApiResponse);
|
||||
} catch (error) {
|
||||
console.error('saveEmailAsContractDocument error:', error);
|
||||
// Pentest 64.1: ApiError mit eigenem statusCode (z.B. 400 vom Race-
|
||||
// Lock) statt pauschal 500.
|
||||
const status = error instanceof ApiError ? error.statusCode : 500;
|
||||
const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler';
|
||||
res.status(500).json({ success: false, error: `Fehler beim Speichern: ${errorMessage}` } as ApiResponse);
|
||||
res.status(status).json({ success: false, error: `Fehler beim Speichern: ${errorMessage}` } as ApiResponse);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2226,8 +2230,10 @@ export async function saveAttachmentAsContractDocument(req: AuthRequest, res: Re
|
||||
res.json({ success: true, data: doc } as ApiResponse);
|
||||
} catch (error) {
|
||||
console.error('saveAttachmentAsContractDocument error:', error);
|
||||
// Pentest 64.1: ApiError mit eigenem statusCode statt pauschal 500.
|
||||
const status = error instanceof ApiError ? error.statusCode : 500;
|
||||
const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler';
|
||||
res.status(500).json({
|
||||
res.status(status).json({
|
||||
success: false,
|
||||
error: `Fehler beim Speichern: ${errorMessage}`,
|
||||
} as ApiResponse);
|
||||
|
||||
Reference in New Issue
Block a user