/** * Error interpretation helper for the Valtech factory. * * Todos los frontends del factory consumen la misma API (backend Go) y la misma * librería. La lógica de interpretar errores debe vivir una sola vez, acá. * * El backend Go (`apperrors`) SIEMPRE devuelve errores como JSON: * { "code": string, "message": string, "operationId": string } * donde `message` ya viene en español y es user-friendly. * * En Angular un error HTTP llega como `HttpErrorResponse` (body en `.error`). * Un fallo de red es un `HttpErrorResponse` con `status === 0`. * * Además `AuthService.handleAuthError` aplana el `HttpErrorResponse` a un * `AuthError { code, message }` (code/message al nivel superior). Por eso este * helper acepta AMBAS formas — el crudo y el aplanado. */ /** * Resultado normalizado de cualquier error. Garantiza una forma estable y * predecible para que las webapps no tengan que hacer narrowing manual. */ export interface InterpretedError { /** Código del backend, o el sentinel `'NETWORK'` / `'UNKNOWN'`. */ code: string; /** Mensaje del backend (español, user-friendly) o un genérico en español. */ message: string; /** `operationId` del backend, si vino. Útil para soporte / tracing. */ operationId?: string; /** HTTP status, si aplica (`0` para fallos de red). */ status?: number; /** `true` si fue un fallo de red (status 0 / sin respuesta). */ isNetwork: boolean; } /** * Normaliza CUALQUIER error a un `InterpretedError`. * * Función pura — sin dependencias de Angular DI, testeable y usable desde * cualquier lado (componentes, servicios, interceptores, scripts). * * Nunca lanza: siempre devuelve un `InterpretedError` válido. * * Casos cubiertos: * - `HttpErrorResponse` con `status === 0` (o sin respuesta) → fallo de red. * - `HttpErrorResponse` con body `{ code, message, operationId }` del backend. * - `AuthError` aplanado `{ code, message }` (code/message top-level). * - `Error` plano de JS → `code: 'UNKNOWN'`, `message: err.message`. * - Cualquier otra cosa (string, null, undefined, objeto raro) → genérico. * * @example * ```ts * try { * await firstValueFrom(this.http.get(url)); * } catch (err) { * const e = interpretError(err); * if (e.isNetwork) { * this.toast.show({ message: e.message, color: 'dark' }); * } else { * this.errorCode.set(e.code); * } * } * ``` */ export declare function interpretError(err: unknown): InterpretedError;