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";
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<any>(loadGroupsPanel());
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 },
}
+};
+
+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