import { HttpErrorResponse } from '@angular/common/http'; import { lastValueFrom, MonoTypeOperatorFunction, Observable, pipe } from 'rxjs'; import { map, tap } from 'rxjs/operators'; import { apiCodes } from '../i18n/api-codes'; import { HttpPlainResponse } from '../models/response.interface'; export const isValidResponse = (status: number) => status >= 200 && status < 300; const validateResponse = (response: T) => { const { status, code, message } = response; if (!isValidResponse(status)) { throw new Error(apiCodes[code]?.msg ?? message); } return response; }; export const handleRequest = async ( request: Observable ): Promise => { try { const response = await lastValueFrom(request); return validateResponse(response); } catch (error) { if (error instanceof HttpErrorResponse) { const errorBody = error.error as Partial< HttpPlainResponse & { data?: { plus_ones_available?: unknown } } >; if (errorBody && typeof errorBody.code === 'number' && typeof errorBody.status === 'number') { const codeKey = String(errorBody.code); const baseApiMessage = apiCodes[codeKey]?.msg; switch (codeKey) { // Custom error messages // case '1059': // throw new Error('La contraseƱa debe tener entre 8 y 16 caracteres'); default: // Original logic for other codes const detailMessage = errorBody.message || error.message; throw new Error(baseApiMessage ?? detailMessage); } } else { throw new Error(error.message || 'Se produjo un error en la solicitud.'); } } throw error; } }; export const validateMutation = ( callback: () => void = () => {} ): MonoTypeOperatorFunction => pipe( map((response) => validateResponse(response)), tap(callback) );