[INT-API-002] Verify response unwrapping in interceptor

This commit is contained in:
senke 2025-12-25 22:40:59 +01:00
parent c6f4a25833
commit 4c98715877
2 changed files with 40 additions and 10 deletions

View file

@ -470,7 +470,8 @@
"description": "Vérifier que l'interceptor unwrap correctement {success: true, data: ...} → data.",
"priority": "P1",
"priority_rank": 13,
"status": "todo",
"status": "completed",
"completed_at": "2025-01-27T14:45:00Z",
"estimated_hours": 1,
"side": "frontend_only",
"files_to_modify": [
@ -1094,13 +1095,13 @@
},
"progress_tracking": {
"total_tasks": 32,
"completed": 12,
"completed": 13,
"in_progress": 0,
"todo": 20,
"todo": 19,
"blocked": 0,
"completion_percentage": 38,
"last_updated": "2025-01-27T14:30:00Z",
"completion_percentage": 41,
"last_updated": "2025-01-27T14:45:00Z",
"estimated_completion_date": null,
"estimated_hours_remaining": 30.5
"estimated_hours_remaining": 29.5
}
}

View file

@ -363,7 +363,7 @@ apiClient.interceptors.response.use(
invalidateStateAfterMutation(url, method);
}
// Vérifier si c'est le format wrapper avec success
// INT-API-002: Vérifier si c'est le format wrapper avec success
if ('success' in response.data) {
if (response.data.success === true) {
// Format wrapper standard: { success: true, data: {...} }
@ -394,9 +394,38 @@ apiClient.interceptors.response.use(
data: unwrappedData,
} as AxiosResponse<any>;
}
// Si success === false, l'erreur sera gérée par le catch
// Mais on devrait normalement ne jamais arriver ici car le backend
// retourne un status HTTP d'erreur dans ce cas
// INT-API-002: Si success === false, traiter comme une erreur même si status est 200
// Le backend peut retourner { success: false, error: {...} } avec un status 200 dans certains cas
if (response.data.success === false) {
const errorData = response.data.error || response.data;
logger.error('[API] Response with success=false:', {
url: response.config.url,
error: errorData,
});
// Créer une erreur Axios pour que l'interceptor d'erreur la gère
// Format attendu par parseApiError: { success: false, error: {...} }
const axiosError = new AxiosError<ApiResponse<any>>(
errorData?.message || 'Request failed',
'API_ERROR',
response.config,
response.request,
{
...response,
status: response.status || 400, // Utiliser le status de la réponse ou 400 par défaut
statusText: response.statusText || 'Bad Request',
data: {
success: false,
error: errorData,
},
} as AxiosResponse<ApiResponse<any>>,
);
// Rejeter pour que l'interceptor d'erreur gère cette erreur
// parseApiError détectera automatiquement le format { success: false, error: {...} }
return Promise.reject(axiosError);
}
}
// Si pas de format wrapper (format direct JSON), retourner la réponse telle quelle