Files
ezbookkeeping/src/lib/services.js
T
2020-11-02 00:02:40 +08:00

161 lines
4.6 KiB
JavaScript

import axios from 'axios';
import userState from "./userstate.js";
let needBlockRequest = false;
let blockedRequests = [];
axios.defaults.baseURL = '/api';
axios.interceptors.request.use(config => {
const token = userState.getToken();
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
if (needBlockRequest && !config.ignoreBlocked) {
return new Promise(resolve => {
blockedRequests.push(newToken => {
if (newToken) {
config.headers.Authorization = `Bearer ${newToken}`;
}
resolve(config);
});
});
}
return config;
}, error => {
return Promise.reject(error);
});
axios.interceptors.response.use(response => {
return response;
}, error => {
if (error.response && !error.response.config.ignoreError && error.response.data && error.response.data.errorCode) {
const errorCode = error.response.data.errorCode;
if (errorCode === 202001 // unauthorized access
&& errorCode <= 202002 // current token is invalid
&& errorCode <= 202003 // current token is expired
&& errorCode <= 202004 // current token type is invalid
&& errorCode <= 202005 // current token requires two factor authorization
&& errorCode <= 202006) { // current token does not require two factor authorization
userState.clearToken();
location.reload();
return Promise.reject({ processed: true });
}
}
return Promise.reject(error);
});
export default {
setLocale: locale => {
axios.defaults.headers.common['Accept-Language'] = locale;
},
authorize: ({ loginName, password }) => {
return axios.post('authorize.json', {
loginName,
password
});
},
authorize2FA: ({ passcode, token }) => {
return axios.post('2fa/authorize.json', {
passcode
}, {
headers: {
Authorization: `Bearer ${token}`
}
});
},
authorize2FAByBackupCode: ({ recoveryCode, token }) => {
return axios.post('2fa/recovery.json', {
recoveryCode
}, {
headers: {
Authorization: `Bearer ${token}`
}
});
},
register: ({ username, email, nickname, password }) => {
return axios.post('register.json', {
username,
email,
nickname,
password
});
},
logout: () => {
return axios.get('logout.json');
},
refreshToken: () => {
needBlockRequest = true;
return axios.post('v1/tokens/refresh.json', {} , {
ignoreBlocked: true
}).then(response => {
const data = response.data;
if (data && data.success && data.result && data.result.newToken) {
userState.updateToken(data.result.newToken);
if (data.result.oldTokenId) {
axios.post('v1/tokens/revoke.json', {
tokenId: data.result.oldTokenId
}, {
ignoreError: true
});
}
}
needBlockRequest = false;
return data.result.newToken;
}).then(newToken => {
blockedRequests.forEach(func => func(newToken));
blockedRequests.length = 0;
});
},
getTokens: () => {
return axios.get('v1/tokens/list.json');
},
revokeToken: ({ tokenId }) => {
return axios.post('v1/tokens/revoke.json', {
tokenId
});
},
getProfile: () => {
return axios.get('v1/users/profile/get.json');
},
updateProfile: ({ email, nickname, password, oldPassword }) => {
return axios.post('v1/users/profile/update.json', {
email,
nickname,
password,
oldPassword
});
},
get2FAStatus: () => {
return axios.get('v1/users/2fa/status.json');
},
enable2FA: () => {
return axios.post('v1/users/2fa/enable/request.json');
},
confirmEnable2FA: ({ secret, passcode }) => {
return axios.post('v1/users/2fa/enable/confirm.json', {
secret,
passcode
});
},
disable2FA: ({ password }) => {
return axios.post('v1/users/2fa/disable.json', {
password
});
},
regenerate2FARecoveryCode: ({ password }) => {
return axios.post('v1/users/2fa/recovery/regenerate.json', {
password
});
},
};