X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/e94e528642f80d57bb6ae5bb717880b2b9adeaca..fa9b3ce44a3a9315207852d1f182000a6166f9e9:/src/store/groups-panel/groups-panel-actions.ts?ds=sidebyside diff --git a/src/store/groups-panel/groups-panel-actions.ts b/src/store/groups-panel/groups-panel-actions.ts index 8bb0128c..b7cf4805 100644 --- a/src/store/groups-panel/groups-panel-actions.ts +++ b/src/store/groups-panel/groups-panel-actions.ts @@ -15,6 +15,7 @@ import { getCommonResourceServiceError, CommonResourceServiceError } from '~/ser import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions'; import { PermissionLevel, PermissionResource } from '~/models/permission'; import { PermissionService } from '~/services/permission-service/permission-service'; +import { FilterBuilder } from '~/services/api/filter-builder'; export const GROUPS_PANEL_ID = "groupsPanel"; export const CREATE_GROUP_DIALOG = "createGroupDialog"; @@ -43,7 +44,7 @@ export const openGroupAttributes = (uuid: string) => export const removeGroup = (uuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Removing ...' })); + dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Removing ...', kind: SnackbarKind.INFO })); await services.groupsService.delete(uuid); dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Removed.', hideDuration: 2000, kind: SnackbarKind.SUCCESS })); dispatch(loadGroupsPanel()); @@ -116,17 +117,14 @@ interface AddGroupMemberArgs { permissionService: PermissionService; } +/** + * Group membership is determined by whether the group has can_read permission on an object. + * If a group G can_read an object A, then we say A is a member of G. + * + * [Permission model docs](https://doc.arvados.org/api/permission-model.html) + */ export const addGroupMember = async ({ user, group, ...args }: AddGroupMemberArgs) => { - - - await createPermission({ - head: { ...group }, - tail: { ...user }, - permissionLevel: PermissionLevel.CAN_MANAGE, - ...args, - }); - await createPermission({ head: { ...user }, tail: { ...group }, @@ -163,4 +161,65 @@ const createPermission = async ({ head, tail, permissionLevel, dispatch, permiss } +}; + +interface DeleteGroupMemberArgs { + user: { uuid: string, name: string }; + group: { uuid: string, name: string }; + dispatch: Dispatch; + permissionService: PermissionService; +} + +export const deleteGroupMember = async ({ user, group, ...args }: DeleteGroupMemberArgs) => { + + await deletePermission({ + tail: group, + head: user, + ...args, + }); + +}; + +interface DeletePermissionLinkArgs { + head: { uuid: string, name: string }; + tail: { uuid: string, name: string }; + dispatch: Dispatch; + permissionService: PermissionService; +} + +export const deletePermission = async ({ head, tail, dispatch, permissionService }: DeletePermissionLinkArgs) => { + + try { + + const permissionsResponse = await permissionService.list({ + + filters: new FilterBuilder() + .addEqual('tailUuid', tail.uuid) + .addEqual('headUuid', head.uuid) + .getFilters() + + }); + + const [permission] = permissionsResponse.items; + + if (permission) { + + await permissionService.delete(permission.uuid); + + } else { + + throw new Error('Permission not found'); + + } + + + } catch (e) { + + dispatch(snackbarActions.OPEN_SNACKBAR({ + message: `Could not delete ${tail.name} -> ${head.name} relation`, + kind: SnackbarKind.ERROR, + })); + + } + }; \ No newline at end of file