mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-07-18 18:11:57 +00:00
4d5676f00e
Co-authored-by: Alan Buscaglia <alanbuscaglia@MacBook-Pro.local> Co-authored-by: alejandrobailo <alejandrobailo94@gmail.com> Co-authored-by: César Arroba <cesar@prowler.com> Co-authored-by: Alejandro Bailo <59607668+alejandrobailo@users.noreply.github.com>
86 lines
2.4 KiB
TypeScript
86 lines
2.4 KiB
TypeScript
import { revalidatePath } from "next/cache";
|
|
|
|
import { getErrorMessage, parseStringify } from "./helper";
|
|
|
|
// Helper function to handle API responses consistently
|
|
export const handleApiResponse = async (
|
|
response: Response,
|
|
pathToRevalidate?: string,
|
|
parse = true,
|
|
) => {
|
|
if (!response.ok) {
|
|
// Read error body safely; prefer JSON, fallback to plain text
|
|
const rawErrorText = await response.text().catch(() => "");
|
|
let errorData: any = null;
|
|
try {
|
|
errorData = rawErrorText ? JSON.parse(rawErrorText) : null;
|
|
} catch {
|
|
errorData = null;
|
|
}
|
|
|
|
const errorsArray = Array.isArray(errorData?.errors)
|
|
? (errorData.errors as any[])
|
|
: undefined;
|
|
const errorDetail =
|
|
errorsArray?.[0]?.detail ||
|
|
errorData?.error ||
|
|
errorData?.message ||
|
|
(rawErrorText && rawErrorText.trim()) ||
|
|
response.statusText ||
|
|
"Oops! Something went wrong.";
|
|
|
|
//5XX errors
|
|
if (response.status >= 500) {
|
|
throw new Error(
|
|
errorDetail ||
|
|
`Server error (${response.status}): The server encountered an error. Please try again later.`,
|
|
);
|
|
}
|
|
|
|
return errorsArray
|
|
? { error: errorDetail, errors: errorsArray, status: response.status }
|
|
: ({ error: errorDetail, status: response.status } as any);
|
|
}
|
|
|
|
// Handle empty or no-content responses gracefully (e.g., 204, empty body)
|
|
if (response.status === 204) {
|
|
if (pathToRevalidate && pathToRevalidate !== "") {
|
|
revalidatePath(pathToRevalidate);
|
|
}
|
|
return { success: true, status: response.status } as any;
|
|
}
|
|
|
|
// Read raw text to determine if there's a body to parse
|
|
const rawText = await response.text();
|
|
const hasBody = rawText && rawText.trim().length > 0;
|
|
|
|
if (!hasBody) {
|
|
if (pathToRevalidate && pathToRevalidate !== "") {
|
|
revalidatePath(pathToRevalidate);
|
|
}
|
|
return { success: true, status: response.status } as any;
|
|
}
|
|
|
|
let data: any;
|
|
try {
|
|
data = JSON.parse(rawText);
|
|
} catch (e) {
|
|
// If body isn't valid JSON, return as text payload
|
|
data = { data: rawText };
|
|
}
|
|
|
|
if (pathToRevalidate && pathToRevalidate !== "") {
|
|
revalidatePath(pathToRevalidate);
|
|
}
|
|
|
|
return parse ? parseStringify(data) : data;
|
|
};
|
|
|
|
// Helper function to handle API errors consistently
|
|
export const handleApiError = (error: unknown): { error: string } => {
|
|
console.error(error);
|
|
return {
|
|
error: getErrorMessage(error),
|
|
};
|
|
};
|