// SPDX-License-Identifier: AGPL-3.0
import { Dispatch } from "redux";
-import { RootState } from "~/store/store";
-import { ServiceRepository } from "~/services/services";
-import { setBreadcrumbs } from "~/store/breadcrumbs/breadcrumbs-actions";
-import { snackbarActions, SnackbarKind } from "~/store/snackbar/snackbar-actions";
-import { LinkAccountType, AccountToLink, LinkAccountStatus } from "~/models/link-account";
-import { saveApiToken, saveUser } from "~/store/auth/auth-action";
-import { unionize, ofType, UnionOf } from '~/common/unionize';
-import { UserResource } from "~/models/user";
-import { GroupResource } from "~/models/group";
+import { RootState } from "store/store";
+import { getUserUuid } from "common/getuser";
+import { ServiceRepository, createServices, setAuthorizationHeader } from "services/services";
+import { setBreadcrumbs } from "store/breadcrumbs/breadcrumbs-actions";
+import { snackbarActions, SnackbarKind } from "store/snackbar/snackbar-actions";
+import { LinkAccountType, AccountToLink, LinkAccountStatus } from "models/link-account";
+import { authActions, getConfig } from "store/auth/auth-action";
+import { unionize, ofType, UnionOf } from 'common/unionize';
+import { UserResource } from "models/user";
+import { GroupResource } from "models/group";
import { LinkAccountPanelError, OriginatingUser } from "./link-account-panel-reducer";
-import { login, logout, setAuthorizationHeader } from "~/store/auth/auth-action";
-import { progressIndicatorActions } from "~/store/progress-indicator/progress-indicator-actions";
-import { WORKBENCH_LOADING_SCREEN } from '~/store/workbench/workbench-actions';
+import { login, logout } from "store/auth/auth-action";
+import { progressIndicatorActions } from "store/progress-indicator/progress-indicator-actions";
+import { WORKBENCH_LOADING_SCREEN } from 'store/workbench/workbench-actions';
export const linkAccountPanelActions = unionize({
LINK_INIT: ofType<{
- targetUser: UserResource | undefined }>(),
+ targetUser: UserResource | undefined
+ }>(),
LINK_LOAD: ofType<{
originatingUser: OriginatingUser | undefined,
targetUser: UserResource | undefined,
targetUserToken: string | undefined,
userToLink: UserResource | undefined,
- userToLinkToken: string | undefined }>(),
+ userToLinkToken: string | undefined
+ }>(),
LINK_INVALID: ofType<{
originatingUser: OriginatingUser | undefined,
targetUser: UserResource | undefined,
userToLink: UserResource | undefined,
- error: LinkAccountPanelError }>(),
+ error: LinkAccountPanelError
+ }>(),
SET_SELECTED_CLUSTER: ofType<{
- selectedCluster: string }>(),
+ selectedCluster: string
+ }>(),
SET_IS_PROCESSING: ofType<{
- isProcessing: boolean}>(),
+ isProcessing: boolean
+ }>(),
HAS_SESSION_DATA: {}
});
return LinkAccountPanelError.NONE;
}
+const newServices = (dispatch: Dispatch<any>, token: string) => {
+ const config = dispatch<any>(getConfig);
+ const svc = createServices(config, { progressFn: () => { }, errorFn: () => { } });
+ setAuthorizationHeader(svc, token);
+ return svc;
+};
+
export const checkForLinkStatus = () =>
(dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
const status = services.linkAccountService.getLinkOpStatus();
let msg: string;
let msgKind: SnackbarKind;
if (status.valueOf() === LinkAccountStatus.CANCELLED) {
- msg = "Account link cancelled!", msgKind = SnackbarKind.INFO;
+ msg = "Account link cancelled!";
+ msgKind = SnackbarKind.INFO;
}
else if (status.valueOf() === LinkAccountStatus.FAILED) {
- msg = "Account link failed!", msgKind = SnackbarKind.ERROR;
+ msg = "Account link failed!";
+ msgKind = SnackbarKind.ERROR;
}
else if (status.valueOf() === LinkAccountStatus.SUCCESS) {
- msg = "Account link success!", msgKind = SnackbarKind.SUCCESS;
+ msg = "Account link success!";
+ msgKind = SnackbarKind.SUCCESS;
}
else {
- msg = "Unknown Error!", msgKind = SnackbarKind.ERROR;
+ msg = "Unknown Error!";
+ msgKind = SnackbarKind.ERROR;
}
dispatch(snackbarActions.OPEN_SNACKBAR({ message: msg, kind: msgKind, hideDuration: 3000 }));
services.linkAccountService.removeLinkOpStatus();
export const switchUser = (user: UserResource, token: string) =>
(dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
- dispatch(saveUser(user));
- dispatch(saveApiToken(token));
+ dispatch(authActions.INIT_USER({ user, token }));
};
export const linkFailed = () =>
}
services.linkAccountService.removeAccountToLink();
services.linkAccountService.saveLinkOpStatus(LinkAccountStatus.FAILED);
- location.reload();
+ window.location.reload();
};
export const loadLinkAccountPanel = () =>
dispatch(checkForLinkStatus());
// Continue loading the link account panel
- dispatch(setBreadcrumbs([{ label: 'Link account'}]));
+ dispatch(setBreadcrumbs([{ label: 'Link account' }]));
const curUser = getState().auth.user;
const curToken = getState().auth.apiToken;
if (curUser && curToken) {
// Use the token of the user we are getting data for. This avoids any admin/non-admin permissions
// issues since a user will always be able to query the api server for their own user data.
- setAuthorizationHeader(services, linkAccountData.token);
- const savedUserResource = await services.userService.get(linkAccountData.userUuid);
- setAuthorizationHeader(services, curToken);
+ const svc = newServices(dispatch, linkAccountData.token);
+ const savedUserResource = await svc.userService.get(linkAccountData.userUuid);
let params: any;
if (linkAccountData.type === LinkAccountType.ACCESS_OTHER_ACCOUNT || linkAccountData.type === LinkAccountType.ACCESS_OTHER_REMOTE_ACCOUNT) {
originatingUser: params.originatingUser,
targetUser: params.targetUser,
userToLink: params.userToLink,
- error}));
+ error
+ }));
return;
}
}
export const startLinking = (t: LinkAccountType) =>
(dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
- const accountToLink = {type: t, userUuid: services.authService.getUuid(), token: services.authService.getApiToken()} as AccountToLink;
+ const userUuid = getUserUuid(getState());
+ if (!userUuid) { return; }
+ const accountToLink = { type: t, userUuid, token: services.authService.getApiToken() } as AccountToLink;
services.linkAccountService.saveAccountToLink(accountToLink);
const auth = getState().auth;
- const isLocalUser = auth.user!.uuid.substring(0,5) === auth.localCluster;
+ const isLocalUser = auth.user!.uuid.substring(0, 5) === auth.localCluster;
let homeCluster = auth.localCluster;
if (isLocalUser && t === LinkAccountType.ACCESS_OTHER_REMOTE_ACCOUNT) {
homeCluster = getState().linkAccountPanel.selectedCluster!;
}
dispatch(logout());
- dispatch(login(auth.localCluster, homeCluster, auth.remoteHosts));
+ dispatch(login(auth.localCluster, homeCluster, auth.loginCluster, auth.remoteHosts));
};
export const getAccountLinkData = () =>
const linkAccountData = services.linkAccountService.getAccountToLink();
if (linkAccountData) {
services.linkAccountService.removeAccountToLink();
- setAuthorizationHeader(services, linkAccountData.token);
- user = await services.userService.get(linkAccountData.userUuid);
+ const svc = newServices(dispatch, linkAccountData.token);
+ user = await svc.userService.get(linkAccountData.userUuid);
dispatch(switchUser(user, linkAccountData.token));
services.linkAccountService.saveLinkOpStatus(LinkAccountStatus.CANCELLED);
}
}
finally {
if (reload) {
- location.reload();
+ window.location.reload();
}
else {
dispatch(progressIndicatorActions.STOP_WORKING(WORKBENCH_LOADING_SCREEN));
try {
// The merge api links the user sending the request into the user
// specified in the request, so change the authorization header accordingly
- setAuthorizationHeader(services, linkState.userToLinkToken);
- await services.linkAccountService.linkAccounts(linkState.targetUserToken, newGroup.uuid);
+ const svc = newServices(dispatch, linkState.userToLinkToken);
+ await svc.linkAccountService.linkAccounts(linkState.targetUserToken, newGroup.uuid);
dispatch(switchUser(linkState.targetUser, linkState.targetUserToken));
services.linkAccountService.removeAccountToLink();
services.linkAccountService.saveLinkOpStatus(LinkAccountStatus.SUCCESS);
- location.reload();
+ window.location.reload();
}
- catch(e) {
+ catch (e) {
// If the link operation fails, delete the previously made project
try {
- setAuthorizationHeader(services, linkState.targetUserToken);
- await services.projectService.delete(newGroup.uuid);
+ const svc = newServices(dispatch, linkState.targetUserToken);
+ await svc.projectService.delete(newGroup.uuid);
}
finally {
dispatch(linkFailed());
throw e;
}
}
- };
\ No newline at end of file
+ };