Files
cssd-front/src/services/global/api.service.js
T
2025-03-26 14:30:47 +03:30

120 lines
3.3 KiB
JavaScript

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);
});