handling 422 status code

This commit is contained in:
2026-05-30 15:06:06 +05:30
parent cbb44539a5
commit fce68c5c5d
4 changed files with 23 additions and 6 deletions

View File

@@ -36,7 +36,7 @@ import type {
SSEEvent, SSEEvent,
ProgressMessage, ProgressMessage,
} from "./features/fetch-requests"; } from "./features/fetch-requests";
import { RETRY_MAX } from "./features/fetch-requests"; import { RETRY_MAX, formatApiError } from "./features/fetch-requests";
import { useConfig } from "../react-openapi"; import { useConfig } from "../react-openapi";
const statusColors: Record<FetchRequestStatus, "default" | "primary" | "warning" | "info" | "success" | "error"> = { const statusColors: Record<FetchRequestStatus, "default" | "primary" | "warning" | "info" | "success" | "error"> = {
@@ -318,8 +318,8 @@ export default function FetchRequestDetail() {
if (!id) return; if (!id) return;
try { try {
await updateMutation.mutateAsync({ id, data: { status: "pending" } }); await updateMutation.mutateAsync({ id, data: { status: "pending" } });
} catch { } catch (err: any) {
// handled by react query setFailNotif(formatApiError(err));
} }
}; };

View File

@@ -55,7 +55,7 @@ import type {
FileSource, FileSource,
EmailSource, EmailSource,
} from "./features/fetch-requests"; } from "./features/fetch-requests";
import { RETRY_MAX } from "./features/fetch-requests"; import { RETRY_MAX, formatApiError } from "./features/fetch-requests";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { useResourceByName, useConfig } from "../react-openapi"; import { useResourceByName, useConfig } from "../react-openapi";
@@ -180,7 +180,7 @@ export default function FetchRequests() {
if (err?.response?.status === 409) { if (err?.response?.status === 409) {
setSnackbar({ message: "Duplicate — same fingerprint already exists", severity: "error" }); setSnackbar({ message: "Duplicate — same fingerprint already exists", severity: "error" });
} else { } else {
setSnackbar({ message: err?.response?.data?.detail || "Failed to create fetch request", severity: "error" }); setSnackbar({ message: formatApiError(err) || "Failed to create fetch request", severity: "error" });
} }
} }
}; };

View File

@@ -113,4 +113,21 @@ export interface FetchRequestFilters {
source_type?: "file" | "email"; source_type?: "file" | "email";
} }
export function formatApiError(err: any): string {
if (!err?.response) return err?.message || "Request failed";
const data = err.response.data;
const status = err.response.status;
if (status === 422 && Array.isArray(data?.detail)) {
return data.detail.map((d: any) => {
const field = d.loc?.filter((s: string) => s !== "body").pop() || "field";
if (d.type === "value_error.missing") return `Missing: ${field}`;
return `${field}: ${d.msg}`;
}).join("; ");
}
if (typeof data?.detail === "string") return data.detail;
return `Request failed (${status})`;
}
export const RETRY_MAX = 3; export const RETRY_MAX = 3;

View File

@@ -15,7 +15,7 @@ export type {
SSEEventStatus, SSEEventStatus,
ProgressMessage, ProgressMessage,
} from "./fetch-requests.models"; } from "./fetch-requests.models";
export { RETRY_MAX } from "./fetch-requests.models"; export { RETRY_MAX, formatApiError } from "./fetch-requests.models";
export { export {
useFetchRequestsList, useFetchRequestsList,
useFetchRequest, useFetchRequest,