import axios from 'axios' import camelcaseObjectDeep from 'camelcase-object-deep' import { getCookie, setCookie } from 'cookies-next' import { 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 && connectionAttempt < maxConnectionAttempt) { await renewToken() return odooApi(method, url, data, headers) } return camelcaseObjectDeep(res.data.result) || [] } catch (error) { console.log(error) } } export default odooApi