blob: 3ea17b981066592c08c6817d68f03fd66d9be15a [file] [log] [blame]
import Axios from 'axios';
import router from '../router';
import { setupCache, buildWebStorage } from 'axios-cache-interceptor';
//Do not change store import.
//Exact match alias set to support
//dotenv customizations.
import store from '.';
Axios.defaults.headers.common['Accept'] = 'application/json';
Axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
const axiosInstance = Axios.create({
withCredentials: true,
});
const api = setupCache(axiosInstance, {
debug: console.log,
methods: ['get'],
interpretHeader: false,
etag: true,
modifiedSince: false,
staleIfError: false,
ttl: 0,
storage: buildWebStorage(localStorage, 'webui-vue-cache:'),
});
api.interceptors.response.use(undefined, (error) => {
let response = error.response;
// TODO: Provide user with a notification and way to keep system active
if (response.status == 401) {
if (response.config.url != '/login') {
window.location = '/login';
// Commit logout to remove XSRF-TOKEN cookie
store.commit('authentication/logout');
}
}
// Check if action is unauthorized.
if (response.status == 403) {
if (isPasswordExpired(response.data)) {
router.push('/change-password');
} else {
// Toast error message will appear on screen.
store.commit('global/setUnauthorized');
}
}
return Promise.reject(error);
});
export default {
get(path, config) {
return api.get(path, config);
},
delete(path, config) {
return api.delete(path, config);
},
post(path, payload, config) {
return api.post(path, payload, config);
},
patch(path, payload, config) {
return api.patch(path, payload, config);
},
put(path, payload, config) {
return api.put(path, payload, config);
},
all(promises) {
return Axios.all(promises);
},
spread(callback) {
return Axios.spread(callback);
},
set_auth_token(token) {
axiosInstance.defaults.headers.common['X-Auth-Token'] = token;
},
};
export const getResponseCount = (responses) => {
let successCount = 0;
let errorCount = 0;
responses.forEach((response) => {
if (response instanceof Error) errorCount++;
else successCount++;
});
return {
successCount,
errorCount,
};
};
export const isPasswordExpired = (data) => {
return !!findMessageId(data, 'PasswordChangeRequired');
};
/**
* Returns the first ExtendedInfo.Message to start with the
* Registry Name (Default: "Base") and end with the given key
* Ignore versions (.<X>.<Y>) --or-- (.<X>.<Y>.<Z>.),
* but adhere to Registry namespace
* @param {object} data - AxiosResponse.data
* @param { {MessageKey: string}} key - key into the message registry
* @param { {MessageRegistryPrefix: string}} [registry=Base] - the name of the
* message registry, undefined param defaults to "Base"
* @returns {ExtendedInfo.Message} ExtendedInfo.Message | undefined
*/
export const findMessageId = (data, key, registry = 'Base') => {
let extInfoMsgs = data?.['@Message.ExtendedInfo'];
return (
extInfoMsgs &&
extInfoMsgs.find((i) => {
const words = i.MessageId.split('.');
return words[words.length - 1] === key && words[0] === registry;
})
);
};