mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.4 KiB
79 lines
2.4 KiB
2 years ago
|
import type { Api } from 'nocodb-sdk'
|
||
|
import { navigateTo, useRoute, useRouter } from '#imports'
|
||
|
import type { NuxtApp } from '#app'
|
||
|
|
||
|
const DbNotFoundMsg = 'Database config not found'
|
||
|
|
||
|
export function addAxiosInterceptors(api: Api<any>, app: NuxtApp) {
|
||
|
const router = useRouter()
|
||
|
const route = useRoute()
|
||
|
|
||
|
api.instance.interceptors.request.use((config) => {
|
||
|
config.headers['xc-gui'] = 'true'
|
||
|
|
||
|
if (app.$state.token.value) config.headers['xc-auth'] = app.$state.token.value
|
||
|
|
||
|
if (!config.url?.endsWith('/user/me') && !config.url?.endsWith('/admin/roles')) {
|
||
|
// config.headers['xc-preview'] = store.state.users.previewAs
|
||
|
}
|
||
|
|
||
|
if (!config.url?.endsWith('/user/me') && !config.url?.endsWith('/admin/roles')) {
|
||
|
if (route && route.params && route.params.shared_base_id) config.headers['xc-shared-base-id'] = route.params.shared_base_id
|
||
|
}
|
||
|
|
||
|
return config
|
||
|
})
|
||
|
|
||
|
// Return a successful response back to the calling service
|
||
|
api.instance.interceptors.response.use(
|
||
|
(response) => response,
|
||
|
// Handle Error
|
||
|
(error) => {
|
||
|
if (error.response && error.response.data && error.response.data.msg === DbNotFoundMsg) return router.replace('/project/0')
|
||
|
|
||
|
// Return any error which is not due to authentication back to the calling service
|
||
|
if (!error.response || error.response.status !== 401) {
|
||
|
return Promise.reject(error)
|
||
|
}
|
||
|
|
||
|
// Logout user if token refresh didn't work or user is disabled
|
||
|
if (error.config.url === '/auth/refresh-token') {
|
||
|
app.$state.signOut()
|
||
|
|
||
|
return Promise.reject(error)
|
||
|
}
|
||
|
|
||
|
// Try request again with new token
|
||
|
return api.instance
|
||
|
.post('/auth/refresh-token', null, {
|
||
|
withCredentials: true,
|
||
|
})
|
||
|
.then((token) => {
|
||
|
// New request with new token
|
||
|
const config = error.config
|
||
|
config.headers['xc-auth'] = token.data.token
|
||
|
app.$state.signIn(token.data.token)
|
||
|
|
||
|
return new Promise((resolve, reject) => {
|
||
|
api.instance
|
||
|
.request(config)
|
||
|
.then((response) => {
|
||
|
resolve(response)
|
||
|
})
|
||
|
.catch((error) => {
|
||
|
reject(error)
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
.catch(async (error) => {
|
||
|
app.$state.signOut()
|
||
|
// todo: handle new user
|
||
|
|
||
|
navigateTo('/signIn')
|
||
|
|
||
|
return Promise.reject(error)
|
||
|
})
|
||
|
},
|
||
|
)
|
||
|
}
|