forked from Shared/esg
Implement normalized error handling with Persian translations across all exception types, replace legacy NestJS exceptions with AppException, and add unit, integration, and smoke tests. - Add error catalog with gateway-owned codes and Persian messages - Introduce AppException wrapping normalized error envelopes - Add translateError helper for automatic messageFa population - Remove claims module and update provider error normalization - Add unit tests for error contracts and helper functions - Add integration tests for admin and inquiry endpoints - Add smoke tests for real provider connectivity - Add test support utilities (auth mocks, assertions, app factory)
61 lines
2.0 KiB
TypeScript
61 lines
2.0 KiB
TypeScript
import { NormalizedErrorDto } from '../dto/normalized-error.dto';
|
|
import {
|
|
buildNormalizedError,
|
|
isAppErrorCode,
|
|
resolveErrorMessageFa,
|
|
resolveErrorCodeFromMessage,
|
|
} from '../constants/error-messages';
|
|
|
|
/**
|
|
* Ensures a NormalizedErrorDto has its `messageFa` field populated.
|
|
*
|
|
* Resolution order:
|
|
* 1. If `messageFa` is already set, return as-is.
|
|
* 2. If a broad gateway error carries a known legacy message, map it to that catalog code.
|
|
* 3. Use the gateway-owned code-based translation map.
|
|
* 4. If nothing matches, return unchanged.
|
|
*/
|
|
export function translateError(error: NormalizedErrorDto): NormalizedErrorDto {
|
|
if (error.messageFa) {
|
|
return error;
|
|
}
|
|
|
|
// Build interpolation context from the error
|
|
const params: Record<string, string> = {};
|
|
if (error.providerCode) params.providerCode = error.providerCode;
|
|
if (error.providerTrackingCode) params.providerTrackingCode = error.providerTrackingCode;
|
|
|
|
if (isAppErrorCode(error.code)) {
|
|
if (error.code === 'HTTP_ERROR' || error.code === 'INTERNAL_ERROR') {
|
|
const messageCode = resolveErrorCodeFromMessage(error.message);
|
|
if (messageCode) {
|
|
return buildNormalizedError(messageCode, {
|
|
message: error.message,
|
|
messageFa: error.messageFa,
|
|
providerMessage: error.providerMessage,
|
|
providerCode: error.providerCode,
|
|
providerTrackingCode: error.providerTrackingCode,
|
|
details: error.details,
|
|
conflict: error.conflict,
|
|
});
|
|
}
|
|
}
|
|
|
|
return buildNormalizedError(error.code, {
|
|
message: error.message,
|
|
messageFa: error.messageFa,
|
|
providerMessage: error.providerMessage,
|
|
providerCode: error.providerCode,
|
|
providerTrackingCode: error.providerTrackingCode,
|
|
details: error.details,
|
|
conflict: error.conflict,
|
|
});
|
|
}
|
|
|
|
const messageFa = resolveErrorMessageFa(error.code, params);
|
|
if (messageFa) return { ...error, messageFa };
|
|
|
|
// Last resort: return unchanged
|
|
return error;
|
|
}
|