mirror of
https://git.meshkee.com/cssd/cssd-front.git
synced 2026-10-10 19:43:18 +03:30
120 lines
3.3 KiB
JavaScript
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);
|
|
}); |