121 lines
2.8 KiB
TypeScript
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;
|