import Vue from 'vue'; import { default as Router, Route } from 'vue-router'; import Login from '@/views/Login.vue'; import Logout from '@/views/Logout.vue'; import Measure from '@/views/Measure.vue'; import Measures from '@/views/Measures.vue'; import NewMeasure from '@/views/NewMeasure.vue'; import NewMeasurement from '@/views/NewMeasurement.vue'; import NotFound from '@/views/NotFound.vue'; import QuickPanels from '@/views/QuickPanels.vue'; import UserAccount from '@/views/UserAccount.vue'; import { authStore } from '@/store'; import { logService } from '@/services/logging'; Vue.use(Router); const logger = logService.getLogger('/router'); const router = new Router({ mode: 'history', base: process.env.BASE_URL, routes: [ { path: '/', redirect: '/measures' }, { path: '/login', name: 'login', component: Login, props: (route) => ({ redirect: route.query.redirect }), meta: { allowPublic: true } }, { path: '/logout', name: 'logout', component: Logout, meta: { allowPublic: true } }, { path: '/measures', name: 'measures', component: Measures }, { path: '/measures/:slug', name: 'measure', component: Measure }, { path: '/user-account', name: 'user-account', component: UserAccount }, { path: '/quick-panels', name: 'quick-panels', component: QuickPanels }, { path: '/new/measure', name: 'new-measure', component: NewMeasure }, { path: '/new/measurement/:slug', name: 'new-measurement', component: NewMeasurement }, { path: '*', name: 'not-found', component: NotFound, meta: { allowPublic: true } } ] }); async function getAuthToken(): Promise { if (authStore.authToken) { return authStore.authToken; } logger.trace('Checking for an existing API token.'); try { const token = await authStore.findLocalToken(); return token; } catch (e) { logger.info('Could not find a valid token.', e); return null; } } // Auth filter router.beforeEach(async (to, from, next) => { if (to.matched.some((record) => record.meta.allowPublic)) { // no auth required next(); } else { // check for auth const token = await getAuthToken(); if (!token) { next({ name: 'login', query: { redirect: to.path } }); } else { next(); } } }); export default router;