feat: enhance invoice validation and error handling with detailed messages

This commit is contained in:
AlexeerCT
2026-01-10 23:42:05 -06:00
parent 25c51120f9
commit 887cbfa5ce
9 changed files with 255 additions and 115 deletions

View File

@@ -10,6 +10,13 @@ const API_BASE_URL = (import.meta.env.VITE_API_URL || '').replace(/\/+$/, '');
export interface ApiResponse<T = any> {
data?: T;
error?: string;
validationErrors?: Array<{
field: string;
message: string;
code?: string;
solution?: string[];
value?: any;
}>;
status: number;
}
@@ -207,30 +214,41 @@ async function fetchApi<T = any>(
if (!response.ok) {
// Manejo especial para errores 422 (validation error)
if (response.status === 422 && data.detail) {
let errorMessage = 'Error de validación: ';
// FastAPI devuelve errores de validación en data.detail como array
if (Array.isArray(data.detail)) {
const errors = data.detail.map((err: any) => {
const field = err.loc ? err.loc.join('.') : 'campo desconocido';
return `${field}: ${err.msg}`;
}).join(', ');
errorMessage += errors;
} else if (typeof data.detail === 'string') {
errorMessage = data.detail;
} else {
errorMessage += JSON.stringify(data.detail);
if (response.status === 422) {
// Errores de validación personalizados (con array errors)
if (data.errors && Array.isArray(data.errors)) {
return {
error: data.message || 'Error de validación',
validationErrors: data.errors,
status: response.status
};
}
// Errores de validación de FastAPI (con detail)
else if (data.detail) {
let errorMessage = 'Error de validación: ';
// FastAPI devuelve errores de validación en data.detail como array
if (Array.isArray(data.detail)) {
const errors = data.detail.map((err: any) => {
const field = err.loc ? err.loc.join('.') : 'campo desconocido';
return `${field}: ${err.msg}`;
}).join(', ');
errorMessage += errors;
} else if (typeof data.detail === 'string') {
errorMessage = data.detail;
} else {
errorMessage += JSON.stringify(data.detail);
}
return {
error: errorMessage,
status: response.status
};
}
return {
error: errorMessage,
status: response.status
};
}
return {
error: data.detail || 'Error en la petición',
error: data.message || data.detail || 'Error en la petición',
status: response.status
};
}