74 lines
1.7 KiB
TypeScript
74 lines
1.7 KiB
TypeScript
"use server";
|
|
|
|
import { getValidAccessToken } from "ikoncomponents";
|
|
import { redirect } from "next/navigation";
|
|
|
|
export interface ExtraOptionsProps {
|
|
isAccessTokenRequird?: boolean;
|
|
revalidatePaths?: string[];
|
|
isReturnErrorResult?: boolean;
|
|
}
|
|
|
|
export const baseApiRequest = async (
|
|
url: string,
|
|
init: RequestInit,
|
|
extraOptions?: ExtraOptionsProps,
|
|
) => {
|
|
const headers = new Headers(init.headers);
|
|
|
|
if (!headers.get("Content-Type")) {
|
|
headers.set("Content-Type", "application/json");
|
|
}
|
|
|
|
if (extraOptions?.isAccessTokenRequird !== false) {
|
|
const accessToken = await getValidAccessToken(
|
|
process.env.NEXT_PUBLIC_IKON_API_URL || "",
|
|
);
|
|
|
|
if (!accessToken?.trim()) {
|
|
redirect("/login.html");
|
|
}
|
|
|
|
headers.set("Authorization", `Bearer ${accessToken.trim()}`);
|
|
}
|
|
|
|
const response = await fetch(url, {
|
|
...init,
|
|
headers,
|
|
});
|
|
|
|
const contentType = response.headers.get("Content-Type");
|
|
|
|
if (!response.ok) {
|
|
let body = "";
|
|
try {
|
|
body = contentType?.includes("application/json")
|
|
? await response.json()
|
|
: await response.text();
|
|
} catch {
|
|
/* ignore */
|
|
}
|
|
const message =
|
|
typeof body === "string"
|
|
? body
|
|
: (() => {
|
|
try {
|
|
return JSON.stringify(body);
|
|
} catch {
|
|
return String(body);
|
|
}
|
|
})();
|
|
console.error(
|
|
`API Request Failed - ${init.method} ${url}: HTTP ${response.status} ${message}`,
|
|
);
|
|
if (extraOptions?.isReturnErrorResult) {
|
|
return body;
|
|
}
|
|
throw new Error(`HTTP ${response.status}: ${message}`);
|
|
}
|
|
|
|
return contentType?.includes("application/json")
|
|
? await response.json()
|
|
: await response.text();
|
|
};
|