import axios from 'axios' import { TokenService } from '../auth/storage.service' import store from '@/store' const ApiService = { init(baseURL) { axios.defaults.baseURL = baseURL; }, setHeader() { axios.defaults.headers.common["Accept"] = `application/json`; axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; }, setAuthHeader() { axios.defaults.headers.common["Authorization"] = `Bearer ${TokenService.getToken()}`; }, removeAuthHeader() { axios.defaults.headers.common["Authorization"] = null; }, get(resource) { return axios.get(resource) }, post(resource, data) { return axios.post(resource, data) }, put(resource, data) { data['_method'] = 'put'; return axios.post(resource, data) }, delete(resource) { let data = {'_method': 'delete'}; return axios.post(resource, data) }, /** * Perform a custom Axios request. * * data is an object containing the following properties: * - method * - url * - data ... request payload * - auth (optional) * - username * - password **/ customRequest(data) { return axios(data); }, _401interceptor: null, mount401Interceptor() { this._401interceptor = axios.interceptors.response.use( (response) => { return response }, async (error) => { if (error.request.status == 401) { if (error.config.url.includes('login')) { // Refresh token has failed. Logout the user store.dispatch('auth/logout'); throw error; } else { // Refresh the access token try{ await store.dispatch('refreshToken') // Retry the original request return this.customRequest({ method: error.config.method, url: error.config.url, data: error.config.data }) } catch (e) { // Refresh has failed - reject the original request throw error } } } // If error was not 401 just reject as is throw error } ) }, unmount401Interceptor() { // Eject the interceptor axios.interceptors.response.eject(this._401interceptor) } } export default ApiService export { ApiService } axios.interceptors.request.use(request => { // console.log("🔵 API Request:", request.method.toUpperCase(), request.url); // console.log("🔹 Headers:", request.headers); // console.log("🔹 Data:", request.data); return request; }, error => { console.error("🔴 Request Error:", error); return Promise.reject(error); }); axios.interceptors.response.use(response => { console.log("🟢 API Response:", response.config.url); console.log("🟢 Status:", response.status); console.log("🟢 Data:", response.data); return response; }, error => { console.error("🔴 API Error:", error.response ? error.response.data : error); return Promise.reject(error); });