import axios from "axios"; import { getCookie, setCookie } from "cookies-next"; import { getAuth } from "./auth"; type axiosParameters = { method: string; url: string; headers: { Authorization: string; "Content-Type"?: string; Token?: string; }; data?: string; }; const renewToken = async () => { const token = await axios.get(process.env.NEXT_PUBLIC_ODOO_API_HOST + "/api/token"); setCookie("token", token.data.result); return token.data.result; }; const getToken = async () => { let token = getCookie("token") as string | undefined; if (token == undefined) token = await renewToken(); return token; }; const odooApi = async (method: string, url: string, data: Record = {}, headers = {}) => { try { const token = await getToken(); const auth = getAuth(); const axiosParameter: axiosParameters = { method, url: process.env.NEXT_PUBLIC_ODOO_API_HOST + url, headers: { Authorization: token ? token : "", ...headers }, }; if (auth && typeof auth === "object" && "token" in auth) { axiosParameter.headers["Token"] = (auth as any).token; } const upper = method.toUpperCase(); // Body methods if (upper === "POST" || upper === "PUT" || upper === "PATCH") { axiosParameter.headers["Content-Type"] = "application/x-www-form-urlencoded"; } if (Object.keys(data).length > 0 && upper !== "GET" && upper !== "HEAD") { const entries = Object.entries(data).filter( ([, v]) => v !== undefined && v !== null && v !== "" ) as [string, string][]; axiosParameter.data = new URLSearchParams(entries).toString(); } const response = await axios(axiosParameter); return response.data; } catch (error) { console.log(JSON.stringify(error)); } }; export default odooApi;