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 = {}; 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; }