refs #13545 Merge branch '13545-projects-service'
[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, serverApi } from "../../common/server-api";
6 import { User } from "../../models/user";
7 import { Dispatch } from "redux";
8 import actions from "../../store/auth/auth-action";
9
10 export const API_TOKEN_KEY = 'apiToken';
11 export const USER_EMAIL_KEY = 'userEmail';
12 export const USER_FIRST_NAME_KEY = 'userFirstName';
13 export const USER_LAST_NAME_KEY = 'userLastName';
14
15 export interface UserDetailsResponse {
16     email: string;
17     first_name: string;
18     last_name: string;
19     is_admin: boolean;
20 }
21
22 export default class AuthService {
23
24     public saveApiToken(token: string) {
25         localStorage.setItem(API_TOKEN_KEY, token);
26     }
27
28     public removeApiToken() {
29         localStorage.removeItem(API_TOKEN_KEY);
30     }
31
32     public getApiToken() {
33         return localStorage.getItem(API_TOKEN_KEY) || undefined;
34     }
35
36     public getUser(): User | undefined {
37         const email = localStorage.getItem(USER_EMAIL_KEY);
38         const firstName = localStorage.getItem(USER_FIRST_NAME_KEY);
39         const lastName = localStorage.getItem(USER_LAST_NAME_KEY);
40         return email && firstName && lastName
41             ? { email, firstName, lastName }
42             : undefined;
43     }
44
45     public saveUser(user: User) {
46         localStorage.setItem(USER_EMAIL_KEY, user.email);
47         localStorage.setItem(USER_FIRST_NAME_KEY, user.firstName);
48         localStorage.setItem(USER_LAST_NAME_KEY, user.lastName);
49     }
50
51     public removeUser() {
52         localStorage.removeItem(USER_EMAIL_KEY);
53         localStorage.removeItem(USER_FIRST_NAME_KEY);
54         localStorage.removeItem(USER_LAST_NAME_KEY);
55     }
56
57     public login() {
58         const currentUrl = `${window.location.protocol}//${window.location.host}/token`;
59         window.location.assign(`${API_HOST}/login?return_to=${currentUrl}`);
60     }
61
62     public logout() {
63         const currentUrl = `${window.location.protocol}//${window.location.host}`;
64         window.location.assign(`${API_HOST}/logout?return_to=${currentUrl}`);
65     }
66
67     public getUserDetails = () => (dispatch: Dispatch) => {
68         dispatch(actions.USER_DETAILS_REQUEST());
69         serverApi
70             .get<UserDetailsResponse>('/users/current')
71             .then(resp => {
72                 dispatch(actions.USER_DETAILS_SUCCESS(resp.data));
73             })
74             // .catch(err => {
75             // });
76     };
77 }