diff --git a/web/src/router.ts b/web/src/router.ts index a023404..f0ed218 100644 --- a/web/src/router.ts +++ b/web/src/router.ts @@ -1,13 +1,17 @@ import Vue from 'vue'; -import Router from 'vue-router'; -import Dashboard from './views/Dashboard.vue'; -import Measures from './views/Measures.vue'; -import UserAccount from './views/UserAccount.vue'; -import QuickPanels from './views/QuickPanels.vue'; +import { default as Router, Route } from 'vue-router'; + +import Dashboard from '@/views/Dashboard.vue'; +import Login from '@/views/Login.vue'; +import Measures from '@/views/Measures.vue'; +import UserAccount from '@/views/UserAccount.vue'; +import QuickPanels from '@/views/QuickPanels.vue'; + +import userService from '@/services/user'; Vue.use(Router); -export default new Router({ +const router = new Router({ mode: 'history', base: process.env.BASE_URL, routes: [ @@ -15,25 +19,47 @@ export default new Router({ path: '/', redirect: '/dashboard' }, + { + path: '/login', + name: 'login', + component: Login + }, { path: '/dashboard', name: 'dashboard', - component: Dashboard + component: Dashboard, + meta: { requiresAuth: true } }, { path: '/measures', name: 'measures', - component: Measures + component: Measures, + meta: { requiresAuth: true } }, { path: '/user-account', name: 'user-account', - component: UserAccount + component: UserAccount, + meta: { requiresAuth: true } }, { path: '/quick-panels', name: 'quick-panels', - component: QuickPanels + component: QuickPanels, + meta: { requiresAuth: true } } ] }); + +// Auth filter +router.beforeEach((to, from, next) => { + if (to.matched.some((record) => record.meta.requiresAuth)) { + if (!userService.isAuthed()) { + next({ + path: '/login', + params: { nextUrl: to.fullPath } }); + } else { next(); } // if authed + } else { next(); } // if auth required +}); + +export default router; diff --git a/web/src/services/pm-api-client.ts b/web/src/services/pm-api-client.ts index 94b0286..cf6f92b 100644 --- a/web/src/services/pm-api-client.ts +++ b/web/src/services/pm-api-client.ts @@ -33,7 +33,7 @@ export class PmApiClient { public getUser(authToken: string): Promise { return this.http .get('/user', { headers: { Authorization: 'Bearer ' + authToken }}) - .then((resp) => return merge(resp.data, { authToken }); ); + .then((resp) => merge(resp.data, { authToken }) ); } public getAllUsers(user: User): Promise { @@ -168,8 +168,9 @@ export class PmApiClient { .then((resp) => true); } - - private authHeader(user: User): { [key: string]: string } { return { Authorization: 'Bearer ' + user.authToken }; + } } + +export default new PmApiClient(process.env.VUE_APP_PM_API_BASE); diff --git a/web/src/services/user.ts b/web/src/services/user.ts new file mode 100644 index 0000000..ac1fdd3 --- /dev/null +++ b/web/src/services/user.ts @@ -0,0 +1,29 @@ +import User from '@/models/user.ts'; +import { default as apiClient, PmApiClient } from '@/services/pm-api-client.ts'; + +export class UserService { + private user?: User = undefined; + + constructor(private api: PmApiClient) { } + + public isAuthed(): boolean { + return this.user != null && this.user.authToken != null; + } + + public getUser(): User | undefined { return this.user; } + + public authUser(email: string, password: string): Promise { + return this.api.createAuthToken(email, password) + .then((token) => this.api.getUser(token)); + } + + public getUserById(reqUserId: string): Promise { + if (this.user == null) { + return Promise.reject(new Error('no currently authenticated user')); + } else { + return this.api.getUserById(this.user, reqUserId); + } + } +} + +export default new UserService(apiClient);