}
async requestItems(api: MiddlewareAPI<Dispatch, RootState>) {
-
const dataExplorer = getDataExplorer(api.getState().dataExplorer, this.getId());
const groupUuid = getCurrentGroupDetailsPanelUuid(api.getState().properties);
-
if (!dataExplorer || !groupUuid) {
-
api.dispatch(groupsDetailsPanelDataExplorerIsNotSet());
-
} else {
-
try {
-
const permissions = await this.services.permissionService.list({
-
filters: new FilterBuilder()
.addEqual('tail_uuid', groupUuid)
.addEqual('link_class', LinkClass.PERMISSION)
.getFilters()
-
});
-
api.dispatch(updateResources(permissions.items));
-
const users = await this.services.userService.list({
-
filters: new FilterBuilder()
.addIn('uuid', permissions.items.map(item => item.headUuid))
.getFilters()
-
});
-
api.dispatch(GroupDetailsPanelActions.SET_ITEMS({
...listResultsToDataExplorerItemsMeta(permissions),
items: users.items.map(item => item.uuid),
}));
-
api.dispatch(updateResources(users.items));
-
} catch (e) {
-
api.dispatch(couldNotFetchGroupDetailsContents());
-
}
}
}
export const createGroup = ({ name, users = [] }: CreateGroupFormData) =>
async (dispatch: Dispatch, _: {}, { groupsService, permissionService }: ServiceRepository) => {
-
dispatch(startSubmit(CREATE_GROUP_FORM));
-
try {
-
const newGroup = await groupsService.create({ name });
-
for (const user of users) {
-
await addGroupMember({
user,
group: newGroup,
dispatch,
permissionService,
});
-
}
-
dispatch(dialogActions.CLOSE_DIALOG({ id: CREATE_GROUP_DIALOG }));
dispatch(reset(CREATE_GROUP_FORM));
dispatch(loadGroupsPanel());
message: `${newGroup.name} group has been created`,
kind: SnackbarKind.SUCCESS
}));
-
return newGroup;
-
} catch (e) {
-
const error = getCommonResourceServiceError(e);
if (error === CommonResourceServiceError.UNIQUE_NAME_VIOLATION) {
dispatch(stopSubmit(CREATE_GROUP_FORM, { name: 'Group with the same name already exists.' } as FormErrors));
}
-
return;
-
}
};
* [Permission model docs](https://doc.arvados.org/api/permission-model.html)
*/
export const addGroupMember = async ({ user, group, ...args }: AddGroupMemberArgs) => {
-
await createPermission({
head: { ...user },
tail: { ...group },
permissionLevel: PermissionLevel.CAN_READ,
...args,
});
-
};
interface CreatePermissionLinkArgs {
}
const createPermission = async ({ head, tail, permissionLevel, dispatch, permissionService }: CreatePermissionLinkArgs) => {
-
try {
-
await permissionService.create({
tailUuid: tail.uuid,
headUuid: head.uuid,
name: permissionLevel,
});
-
} catch (e) {
-
dispatch(snackbarActions.OPEN_SNACKBAR({
message: `Could not add ${tail.name} -> ${head.name} relation`,
kind: SnackbarKind.ERROR,
}));
-
}
-
};
interface DeleteGroupMemberArgs {
}
export const deleteGroupMember = async ({ user, group, ...args }: DeleteGroupMemberArgs) => {
-
await deletePermission({
tail: group,
head: user,
...args,
});
-
};
interface DeletePermissionLinkArgs {
}
export const deletePermission = async ({ head, tail, dispatch, permissionService }: DeletePermissionLinkArgs) => {
-
try {
-
const permissionsResponse = await permissionService.list({
-
filters: new FilterBuilder()
.addEqual('tail_uuid', tail.uuid)
.addEqual('head_uuid', 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
import { GroupsPanelColumnNames } from '~/views/groups-panel/groups-panel';
export class GroupsPanelMiddlewareService extends DataExplorerMiddlewareService {
-
constructor(private services: ServiceRepository, id: string) {
super(id);
}
-
async requestItems(api: MiddlewareAPI<Dispatch, RootState>) {
-
const dataExplorer = getDataExplorer(api.getState().dataExplorer, this.getId());
-
if (!dataExplorer) {
-
api.dispatch(groupsPanelDataExplorerIsNotSet());
-
} else {
-
try {
-
const order = new OrderBuilder<GroupResource>();
const sortColumn = getSortColumn(dataExplorer);
if (sortColumn) {
sortColumn.sortDirection === SortDirection.ASC && sortColumn.name === GroupsPanelColumnNames.GROUP
? OrderDirection.ASC
: OrderDirection.DESC;
-
order.addOrder(direction, 'name');
}
-
const filters = new FilterBuilder()
.addNotIn('group_class', [GroupClass.PROJECT])
.addILike('name', dataExplorer.searchValue)
.getFilters();
-
const response = await this.services.groupsService
.list({
...dataExplorerToListParams(dataExplorer),
filters,
order: order.getOrder(),
});
-
api.dispatch(updateResources(response.items));
-
api.dispatch(GroupsPanelActions.SET_ITEMS({
...listResultsToDataExplorerItemsMeta(response),
items: response.items.map(item => item.uuid),
}));
-
const permissions = await this.services.permissionService.list({
-
filters: new FilterBuilder()
.addIn('tail_uuid', response.items.map(item => item.uuid))
.getFilters()
-
});
-
api.dispatch(updateResources(permissions.items));
-
-
} catch (e) {
-
api.dispatch(couldNotFetchFavoritesContents());
-
}
}
}