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