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; 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) || !('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); }); }); });