64 lines
1.9 KiB
TypeScript
64 lines
1.9 KiB
TypeScript
import { isEmpty, isNil } from 'lodash-es';
|
|
import { client } from '@/client/client.gen';
|
|
import {
|
|
doRefreshToken,
|
|
getAccessToken,
|
|
getRefreshToken,
|
|
logout,
|
|
setAccessToken,
|
|
setRefreshToken,
|
|
} from './token';
|
|
|
|
export function configInternalApiClient() {
|
|
client.setConfig({
|
|
baseUrl: '/api/v1/',
|
|
headers: {
|
|
'X-Api-Version': 'latest',
|
|
},
|
|
});
|
|
|
|
client.interceptors.request.use((request) => {
|
|
const token = getAccessToken();
|
|
if (!isNil(token) && !isEmpty(token)) {
|
|
request.headers.set('Authorization', `Bearer ${token}`);
|
|
}
|
|
return request;
|
|
});
|
|
|
|
client.interceptors.response.use(async (response, request, options) => {
|
|
if (response.status === 401) {
|
|
// Avoid infinite loop if the refresh token request itself fails
|
|
if (request.url.includes('/auth/refresh')) {
|
|
// Refresh token failed, clear tokens and redirect to login page
|
|
logout('Session expired');
|
|
}
|
|
else {
|
|
const refreshToken = getRefreshToken();
|
|
if (isNil(refreshToken) || isEmpty(refreshToken)) {
|
|
logout('You are not logged in');
|
|
}
|
|
else {
|
|
const refreshResponse = await doRefreshToken(refreshToken);
|
|
if (!isEmpty(refreshResponse)) {
|
|
const { access_token, refresh_token } = refreshResponse;
|
|
setAccessToken(access_token!);
|
|
setRefreshToken(refresh_token!);
|
|
|
|
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
const headers = new Headers(request.headers);
|
|
headers.set('Authorization', `Bearer ${access_token}`);
|
|
|
|
return fetchFn(request.url, {
|
|
method: request.method,
|
|
headers,
|
|
body: (options.serializedBody ?? options.body) as BodyInit | null | undefined,
|
|
signal: request.signal,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return response;
|
|
});
|
|
}
|