|
|
|
import { store } from 'nuxt3-store'
|
|
|
|
import { useNuxtApp } from '#app'
|
|
|
|
|
|
|
|
export const useUser = () => {
|
|
|
|
const user = store({
|
|
|
|
name: 'user',
|
|
|
|
type: 'localstorage',
|
|
|
|
value: { token: null, user: null },
|
|
|
|
reactiveType: 'reactive',
|
|
|
|
version: '1.0.0',
|
|
|
|
})
|
|
|
|
|
|
|
|
const { $api } = useNuxtApp()
|
|
|
|
const route = useRoute()
|
|
|
|
const router = useRouter()
|
|
|
|
|
|
|
|
const getUser = async (args = {}) => {
|
|
|
|
const userInfo = await $api.auth.me(args, {
|
|
|
|
headers: {
|
|
|
|
'xc-auth': user.value.token,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
user.user = userInfo
|
|
|
|
}
|
|
|
|
|
|
|
|
const setToken = (token) => {
|
|
|
|
user.token = token
|
|
|
|
}
|
|
|
|
|
|
|
|
$api?.instance?.interceptors.request.use((config) => {
|
|
|
|
config.headers['xc-gui'] = 'true'
|
|
|
|
|
|
|
|
if (user?.token)
|
|
|
|
config.headers['xc-auth'] = user?.token
|
|
|
|
|
|
|
|
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
|
|
|
|
})
|
|
|
|
|
|
|
|
// $axios.setBaseURL('http://localhost:8080')
|
|
|
|
|
|
|
|
$api?.instance?.interceptors.response.use((response) => {
|
|
|
|
// Return a successful response back to the calling service
|
|
|
|
return response
|
|
|
|
}, (error) => {
|
|
|
|
if (error.response && error.response.data && error.response.data.msg === 'Database config not found') {
|
|
|
|
router.replace('/project/0')
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return any error which is not due to authentication back to the calling service
|
|
|
|
if (!error.response || error.response.status !== 401) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
reject(error)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// Logout user if token refresh didn't work or user is disabled
|
|
|
|
if (error.config.url === '/auth/refresh-token') {
|
|
|
|
// todo: clear token
|
|
|
|
// store.dispatch('users/ActSignOut')
|
|
|
|
setToken(null)
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
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
|
|
|
|
user.token = token.data.token
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
$api.instance.request(config).then((response) => {
|
|
|
|
resolve(response)
|
|
|
|
}).catch((error) => {
|
|
|
|
reject(error)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
.catch(async (error) => {
|
|
|
|
// todo: clear token
|
|
|
|
// await store.dispatch('users/ActSignOut')
|
|
|
|
setToken(null)
|
|
|
|
if (store.state.project.appInfo.firstUser) {
|
|
|
|
router.replace('/')
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// $toast.clear()
|
|
|
|
// $toast.info('Token Expired. Please login again.', {
|
|
|
|
// position: 'bottom-center'
|
|
|
|
// }).goAway(5000)
|
|
|
|
router.replace('/user/authentication/signin')
|
|
|
|
}
|
|
|
|
return Promise.reject(error)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
return { user, setToken, getUser }
|
|
|
|
}
|