96 lines
2.2 KiB
JavaScript
96 lines
2.2 KiB
JavaScript
import router from '@/router';
|
|
|
|
export default async function call(method, args) {
|
|
if (!args) {
|
|
args = {};
|
|
}
|
|
|
|
let headers = {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json; charset=utf-8',
|
|
'X-Jingrow-Site-Name': window.location.hostname
|
|
};
|
|
|
|
let team = localStorage.getItem('current_team') || null;
|
|
if (team) {
|
|
headers['X-Jcloud-Team'] = team;
|
|
}
|
|
|
|
if (window.csrf_token && window.csrf_token !== '{{ csrf_token }}') {
|
|
headers['X-Jingrow-CSRF-Token'] = window.csrf_token;
|
|
}
|
|
|
|
updateState(this, 'RequestStarted', null);
|
|
|
|
const res = await fetch(`/api/action/${method}`, {
|
|
method: 'POST',
|
|
headers,
|
|
body: JSON.stringify(args)
|
|
});
|
|
|
|
if (res.ok) {
|
|
updateState(this, null, null);
|
|
const data = await res.json();
|
|
if (data.docs || method === 'login') {
|
|
return data;
|
|
}
|
|
return data.message;
|
|
} else {
|
|
let response = await res.text();
|
|
let error, exception;
|
|
try {
|
|
error = JSON.parse(response);
|
|
// eslint-disable-next-line no-empty
|
|
} catch (e) {}
|
|
let errorParts = [
|
|
[method, error.exc_type, error._error_message].filter(Boolean).join(' ')
|
|
];
|
|
if (error.exc) {
|
|
exception = error.exc;
|
|
try {
|
|
exception = JSON.parse(exception)[0];
|
|
console.log(exception);
|
|
// eslint-disable-next-line no-empty
|
|
} catch (e) {}
|
|
}
|
|
let e = new Error(errorParts.join('\n'));
|
|
e.exc_type = error.exc_type;
|
|
e.exc = exception;
|
|
e.messages = error._server_messages
|
|
? JSON.parse(error._server_messages)
|
|
: [];
|
|
e.messages = e.messages.concat(error.message);
|
|
e.messages = e.messages.map(m => {
|
|
try {
|
|
return JSON.parse(m).message;
|
|
} catch (error) {
|
|
return m;
|
|
}
|
|
});
|
|
e.messages = e.messages.filter(Boolean);
|
|
if (!e.messages.length) {
|
|
e.messages = error._error_message
|
|
? [error._error_message]
|
|
: ['Internal Server Error'];
|
|
}
|
|
updateState(this, null, e.messages.join('\n'));
|
|
|
|
if (
|
|
[401, 403].includes(res.status) &&
|
|
router.currentRoute.name !== 'Login'
|
|
) {
|
|
router.push('/login');
|
|
}
|
|
throw e;
|
|
}
|
|
|
|
function updateState(vm, state, errorMessage) {
|
|
if (vm?.state !== undefined) {
|
|
vm.state = state;
|
|
}
|
|
if (vm?.errorMessage !== undefined) {
|
|
vm.errorMessage = errorMessage;
|
|
}
|
|
}
|
|
}
|