52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import { boot } from 'quasar/wrappers';
|
|
import { StateInterface } from 'src/store';
|
|
import { RouteRecord } from 'vue-router';
|
|
import { Store } from 'vuex'
|
|
|
|
export default boot<Store<StateInterface>>(({ router, store }) => {
|
|
router.beforeEach((to, from, next) => {
|
|
store
|
|
.dispatch('user/loadFromLocalStorage')
|
|
.then(() => {
|
|
const user = store.state.user.user;
|
|
const session = store.state.user.session;
|
|
|
|
let permissions: string[] = [];
|
|
user.roles.forEach(role => {
|
|
permissions = permissions.concat(role.permissions);
|
|
});
|
|
|
|
if (to.name != 'login') {
|
|
if (session.expires >= new Date() || session.token === '') {
|
|
store.dispatch('user/doLogout').catch(error => {
|
|
console.warn(error);
|
|
});
|
|
return next({ name: 'login', query: { redirect: to.fullPath } });
|
|
}
|
|
if (
|
|
to.matched.every((record: RouteRecord) => {
|
|
if (!('meta' in record) || !('permissions' in record.meta))
|
|
return true;
|
|
const test = record.meta.permissions.every((permission: string) => {
|
|
return permissions.includes(
|
|
permission
|
|
);
|
|
})
|
|
console.log('permissions', test)
|
|
return test
|
|
})
|
|
) {
|
|
next();
|
|
} else {
|
|
next({ name: 'login', query: { redirect: to.fullPath } });
|
|
}
|
|
} else {
|
|
next();
|
|
}
|
|
})
|
|
.catch(error => {
|
|
console.exception(error);
|
|
});
|
|
});
|
|
});
|