Add site manager and initial validation
[arvados-workbench2.git] / src / store / auth / auth-action-session.ts
1 import { Dispatch } from "redux";
2 import { setBreadcrumbs } from "~/store/breadcrumbs/breadcrumbs-actions";
3 import { RootState } from "~/store/store";
4 import { ServiceRepository } from "~/services/services";
5 import Axios from "axios";
6 import { getUserFullname } from "~/models/user";
7 import { authActions } from "~/store/auth/auth-action";
8 import { Config, DISCOVERY_URL } from "~/common/config";
9 import { Session } from "~/models/session";
10 import { progressIndicatorActions } from "~/store/progress-indicator/progress-indicator-actions";
11 import { UserDetailsResponse } from "~/services/auth-service/auth-service";
12
13
14 const getSessionOrigin = async (session: Session) => {
15     let url = session.remoteHost;
16     if (url.indexOf('://') < 0) {
17         url = 'https://' + url;
18     }
19     const origin = new URL(url).origin;
20     try {
21         const resp = await Axios.get<Config>(`${origin}/${DISCOVERY_URL}`);
22         return resp.data.origin;
23     } catch (err) {
24         try {
25             const resp = await Axios.get<any>(`${origin}/status.json`);
26             return resp.data.apiBaseURL;
27         } catch (err) {
28         }
29     }
30     return null;
31 };
32
33 const getUserDetails = async (origin: string, token: string): Promise<UserDetailsResponse> => {
34     const resp = await Axios.get<UserDetailsResponse>(`${origin}/arvados/v1/users/current`, {
35         headers: {
36             Authorization: `OAuth2 ${token}`
37         }
38     });
39     return resp.data;
40 };
41
42 const validateSessions = () =>
43     async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
44         const sessions = getState().auth.sessions;
45         dispatch(progressIndicatorActions.START_WORKING("sessionsValidation"));
46         for (const session of sessions) {
47             if (!session.validated) {
48                 const origin = await getSessionOrigin(session);
49                 const user = await getUserDetails(origin, session.token);
50             }
51         }
52         dispatch(progressIndicatorActions.STOP_WORKING("sessionsValidation"));
53     };
54
55 export const addSession = (remoteHost: string) =>
56     (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
57         const user = getState().auth.user!;
58         const clusterId = remoteHost.match(/^(\w+)\./)![1];
59
60         dispatch(authActions.ADD_SESSION({
61             loggedIn: false,
62             validated: false,
63             email: user.email,
64             username: getUserFullname(user),
65             remoteHost,
66             clusterId,
67             token: ''
68         }));
69
70         services.authService.saveSessions(getState().auth.sessions);
71     };
72
73 export const loadSiteManagerPanel = () =>
74     async (dispatch: Dispatch<any>) => {
75         try {
76             dispatch(setBreadcrumbs([{ label: 'Site Manager'}]));
77             dispatch(validateSessions());
78         } catch (e) {
79             return;
80         }
81     };