flaschengeist-frontend/src/boot/login.ts

54 lines
1.7 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;
if (record.meta) {
if ((<{permissions: FG.Permission[]}>record.meta).permissions) {
return (<{permissions: FG.Permission[]}>record.meta).permissions.every((permission: string) => {
return permissions.includes(
permission
);
})
}
}
})
) {
next();
} else {
next({ name: 'login', query: { redirect: to.fullPath } });
}
} else {
next();
}
})
.catch(error => {
console.exception(error);
});
});
});