121 lines
2.8 KiB
TypeScript

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 DeleteMeasure from '@/views/DeleteMeasure.vue';
import EditMeasure from '@/views/EditMeasure.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: '/delete/measure/:slug',
name: 'delete-measure',
component: DeleteMeasure
},
{
path: '/edit/measure/:slug',
name: 'edit-measure',
component: EditMeasure
},
{
path: '*',
name: 'not-found',
component: NotFound,
meta: { allowPublic: true }
}
]
});
async function getAuthToken(): Promise<string | null> {
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;