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";
14 const getSessionOrigin = async (session: Session) => {
15 let url = session.remoteHost;
16 if (url.indexOf('://') < 0) {
17 url = 'https://' + url;
19 const origin = new URL(url).origin;
21 const resp = await Axios.get<Config>(`${origin}/${DISCOVERY_URL}`);
22 return resp.data.origin;
25 const resp = await Axios.get<any>(`${origin}/status.json`);
26 return resp.data.apiBaseURL;
33 const getUserDetails = async (origin: string, token: string): Promise<UserDetailsResponse> => {
34 const resp = await Axios.get<UserDetailsResponse>(`${origin}/arvados/v1/users/current`, {
36 Authorization: `OAuth2 ${token}`
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);
52 dispatch(progressIndicatorActions.STOP_WORKING("sessionsValidation"));
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];
60 dispatch(authActions.ADD_SESSION({
64 username: getUserFullname(user),
70 services.authService.saveSessions(getState().auth.sessions);
73 export const loadSiteManagerPanel = () =>
74 async (dispatch: Dispatch<any>) => {
76 dispatch(setBreadcrumbs([{ label: 'Site Manager'}]));
77 dispatch(validateSessions());