import axios from 'axios'; import camelcaseObjectDeep from 'camelcase-object-deep'; import { getCookie, setCookie } from 'cookies-next'; import { deleteAuth, getAuth } from '../utils/auth'; const renewToken = async () => { let 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'); if (token == undefined) token = await renewToken(); return token; }; const maxConnectionAttempt = 15; let connectionAttempt = 0; /** * The `odooApi` function is used to make API requests to an Odoo backend with customizable parameters such as `method`, `url`, `data`, and `headers`. * * @async * @function * @param {string} method - HTTP method for the API request (e.g., GET, POST, PUT, DELETE). * @param {string} url - URL endpoint for the API request. * @param {Object} data - Data to be sent in the request payload. * @param {Object} headers - Custom headers to be sent in the request. * @returns {Promise} - A Promise that resolves to the API response data or an empty array. */ const odooApi = async (method, url, data = {}, headers = {}) => { connectionAttempt++; try { let token = await getToken(); const auth = getAuth(); let axiosParameter = { method, url: process.env.NEXT_PUBLIC_ODOO_API_HOST + url, headers: { Authorization: token, ...headers }, }; if (auth) axiosParameter.headers['Token'] = auth.token; if (method.toUpperCase() == 'POST') axiosParameter.headers['Content-Type'] = 'application/x-www-form-urlencoded'; if (Object.keys(data).length > 0) axiosParameter.data = new URLSearchParams( Object.entries(data) ).toString(); let res = await axios(axiosParameter); if (res.data.status.code == 401) { if (connectionAttempt < maxConnectionAttempt) { await renewToken(); return odooApi(method, url, data, headers); } else { await deleteAuth(); window.location.href = '/login'; return false; } } return camelcaseObjectDeep(res.data.result) || []; } catch (error) { console.log(error); } }; export default odooApi;