X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/5627bf1a83323d2b0364cb069564998eb8c6ca7a..62ff5a943865229c1630c66366f824511048ce63:/src/store/auth/auth-action.ts diff --git a/src/store/auth/auth-action.ts b/src/store/auth/auth-action.ts index ac2e0b7e..64ee7196 100644 --- a/src/store/auth/auth-action.ts +++ b/src/store/auth/auth-action.ts @@ -4,10 +4,16 @@ import { ofType, unionize, UnionOf } from '~/common/unionize'; import { Dispatch } from "redux"; +import { reset, stopSubmit } from 'redux-form'; import { User } from "~/models/user"; import { RootState } from "../store"; import { ServiceRepository } from "~/services/services"; +import { getCommonResourceServiceError, CommonResourceServiceError } from '~/services/common-service/common-resource-service'; import { AxiosInstance } from "axios"; +import { snackbarActions } from '~/store/snackbar/snackbar-actions'; +import { dialogActions } from '~/store/dialog/dialog-actions'; +import { SshKeyCreateFormDialogData, SshKey, KeyType } from '~/models/ssh-key'; +import { setBreadcrumbs } from '../breadcrumbs/breadcrumbs-actions'; export const authActions = unionize({ SAVE_API_TOKEN: ofType(), @@ -15,9 +21,13 @@ export const authActions = unionize({ LOGOUT: {}, INIT: ofType<{ user: User, token: string }>(), USER_DETAILS_REQUEST: {}, - USER_DETAILS_SUCCESS: ofType() + USER_DETAILS_SUCCESS: ofType(), + SET_SSH_KEYS: ofType(), + ADD_SSH_KEY: ofType() }); +export const SSH_KEY_CREATE_FORM_NAME = 'sshKeyCreateFormName'; + function setAuthorizationHeader(services: ServiceRepository, token: string) { services.apiClient.defaults.headers.common = { Authorization: `OAuth2 ${token}` @@ -70,4 +80,46 @@ export const getUserDetails = () => (dispatch: Dispatch, getState: () => RootSta }); }; +export const openSshKeyCreateDialog = () => dialogActions.OPEN_DIALOG({ id: SSH_KEY_CREATE_FORM_NAME, data: {} }); + +export const createSshKey = (data: SshKeyCreateFormDialogData) => + async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + try { + const userUuid = getState().auth.user!.uuid; + const { name, publicKey } = data; + const newSshKey = await services.authorizedKeysService.create({ + name, + publicKey, + keyType: KeyType.SSH, + authorizedUserUuid: userUuid + }); + dispatch(dialogActions.CLOSE_DIALOG({ id: SSH_KEY_CREATE_FORM_NAME })); + dispatch(reset(SSH_KEY_CREATE_FORM_NAME)); + dispatch(authActions.ADD_SSH_KEY(newSshKey)); + dispatch(snackbarActions.OPEN_SNACKBAR({ + message: "Public key has been successfully created.", + hideDuration: 2000 + })); + } catch (e) { + const error = getCommonResourceServiceError(e); + if (error === CommonResourceServiceError.UNIQUE_PUBLIC_KEY) { + dispatch(stopSubmit(SSH_KEY_CREATE_FORM_NAME, { publicKey: 'Public key already exists.' })); + } else if (error === CommonResourceServiceError.INVALID_PUBLIC_KEY) { + dispatch(stopSubmit(SSH_KEY_CREATE_FORM_NAME, { publicKey: 'Public key is invalid' })); + } + } + }; + +export const loadSshKeysPanel = () => + async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + try { + dispatch(setBreadcrumbs([{ label: 'SSH Keys'}])); + const response = await services.authorizedKeysService.list(); + dispatch(authActions.SET_SSH_KEYS(response.items)); + } catch (e) { + return; + } + }; + + export type AuthAction = UnionOf;