handling 422 status code
This commit is contained in:
@@ -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));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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" });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user