Merge branch 'master' into 13797-refatoring-part2
[arvados-workbench2.git] / src / services / auth-service / auth-service.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { API_HOST } from "../../common/api/server-api";
6 import { User } from "../../models/user";
7 import { AxiosInstance } from "../../../node_modules/axios";
8
9 export const API_TOKEN_KEY = 'apiToken';
10 export const USER_EMAIL_KEY = 'userEmail';
11 export const USER_FIRST_NAME_KEY = 'userFirstName';
12 export const USER_LAST_NAME_KEY = 'userLastName';
13 export const USER_UUID_KEY = 'userUuid';
14 export const USER_OWNER_UUID_KEY = 'userOwnerUuid';
15
16 export interface UserDetailsResponse {
17     email: string;
18     first_name: string;
19     last_name: string;
20     uuid: string;
21     owner_uuid: string;
22     is_admin: boolean;
23 }
24
25 export class AuthService {
26
27     constructor(protected serverApi: AxiosInstance) { }
28
29     public saveApiToken(token: string) {
30         localStorage.setItem(API_TOKEN_KEY, token);
31     }
32
33     public removeApiToken() {
34         localStorage.removeItem(API_TOKEN_KEY);
35     }
36
37     public getApiToken() {
38         return localStorage.getItem(API_TOKEN_KEY) || undefined;
39     }
40
41     public getUuid() {
42         return localStorage.getItem(USER_UUID_KEY) || undefined;
43     }
44
45     public getOwnerUuid() {
46         return localStorage.getItem(USER_OWNER_UUID_KEY) || undefined;
47     }
48
49     public getUser(): User | undefined {
50         const email = localStorage.getItem(USER_EMAIL_KEY);
51         const firstName = localStorage.getItem(USER_FIRST_NAME_KEY);
52         const lastName = localStorage.getItem(USER_LAST_NAME_KEY);
53         const uuid = localStorage.getItem(USER_UUID_KEY);
54         const ownerUuid = localStorage.getItem(USER_OWNER_UUID_KEY);
55
56         return email && firstName && lastName && uuid && ownerUuid
57             ? { email, firstName, lastName, uuid, ownerUuid }
58             : undefined;
59     }
60
61     public saveUser(user: User) {
62         localStorage.setItem(USER_EMAIL_KEY, user.email);
63         localStorage.setItem(USER_FIRST_NAME_KEY, user.firstName);
64         localStorage.setItem(USER_LAST_NAME_KEY, user.lastName);
65         localStorage.setItem(USER_UUID_KEY, user.uuid);
66         localStorage.setItem(USER_OWNER_UUID_KEY, user.ownerUuid);
67     }
68
69     public removeUser() {
70         localStorage.removeItem(USER_EMAIL_KEY);
71         localStorage.removeItem(USER_FIRST_NAME_KEY);
72         localStorage.removeItem(USER_LAST_NAME_KEY);
73         localStorage.removeItem(USER_UUID_KEY);
74         localStorage.removeItem(USER_OWNER_UUID_KEY);
75     }
76
77     public login() {
78         const currentUrl = `${window.location.protocol}//${window.location.host}/token`;
79         window.location.assign(`${API_HOST}/login?return_to=${currentUrl}`);
80     }
81
82     public logout() {
83         const currentUrl = `${window.location.protocol}//${window.location.host}`;
84         window.location.assign(`${API_HOST}/logout?return_to=${currentUrl}`);
85     }
86
87     public getUserDetails = (): Promise<User> => {
88         return this.serverApi
89             .get<UserDetailsResponse>('/users/current')
90             .then(resp => ({
91                 email: resp.data.email,
92                 firstName: resp.data.first_name,
93                 lastName: resp.data.last_name,
94                 uuid: resp.data.uuid,
95                 ownerUuid: resp.data.owner_uuid
96             }));
97     }
98
99     public getRootUuid() {
100         const uuid = this.getOwnerUuid();
101         const uuidParts = uuid ? uuid.split('-') : [];
102         return uuidParts.length > 1 ? `${uuidParts[0]}-${uuidParts[1]}` : undefined;
103     }
104 }