[INT-API-002] Verify response unwrapping in interceptor
This commit is contained in:
parent
c6f4a25833
commit
4c98715877
2 changed files with 40 additions and 10 deletions
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue