From edbbee5413cf7b160e159ae030987c37330800ae Mon Sep 17 00:00:00 2001 From: Peter Amstutz Date: Wed, 16 Oct 2024 17:43:17 -0400 Subject: [PATCH] 22204: Fix sharing dialog loading * Split user/group queries so we don't ask for groups from the user endpoint and vice versa * Make each query conditional on whether any permissions to users or groups were actually returned * Send user/group queries in parallel * Wrap the whole thing in try/finally to make sure it stops the loading spinner if there's an error Arvados-DCO-1.1-Signed-off-by: Peter Amstutz --- .../sharing-dialog/sharing-dialog-actions.ts | 95 +++++++++++-------- 1 file changed, 57 insertions(+), 38 deletions(-) diff --git a/services/workbench2/src/store/sharing-dialog/sharing-dialog-actions.ts b/services/workbench2/src/store/sharing-dialog/sharing-dialog-actions.ts index 40c648f3e6..d3e157b8cc 100644 --- a/services/workbench2/src/store/sharing-dialog/sharing-dialog-actions.ts +++ b/services/workbench2/src/store/sharing-dialog/sharing-dialog-actions.ts @@ -34,6 +34,8 @@ import { resourcesActions } from "store/resources/resources-actions"; import { getPublicGroupUuid, getAllUsersGroupUuid } from "store/workflow-panel/workflow-panel-actions"; import { getSharingPublicAccessFormData } from './sharing-dialog-types'; import { UserResource } from "models/user"; +import { GroupResource } from "models/group"; +import { ListResults } from 'services/common-service/common-service'; export const openSharingDialog = (resourceUuid: string, refresh?: () => void) => (dispatch: Dispatch) => { @@ -150,48 +152,65 @@ export const initializeManagementForm = async (dispatch: Dispatch, getState: () return; } dispatch(progressIndicatorActions.START_WORKING(SHARING_DIALOG_NAME)); - const resourceUuid = dialog?.data.resourceUuid; - const { items: permissionLinks } = await permissionService.listResourcePermissions(resourceUuid); - dispatch(initializePublicAccessForm(permissionLinks)); - const filters = new FilterBuilder() - .addIn('uuid', Array.from(new Set(permissionLinks.map(({ tailUuid }) => tailUuid)))) - .getFilters(); - - const { items: users } = await userService.list({ filters, count: "none", limit: 1000 }); - const { items: groups } = await groupsService.list({ filters, count: "none", limit: 1000 }); - - const getEmail = (tailUuid: string) => { - const user = users.find(({ uuid }) => uuid === tailUuid); - return user - ? user.email - : null; - }; + try { + const resourceUuid = dialog?.data.resourceUuid; + const { items: permissionLinks } = await permissionService.listResourcePermissions(resourceUuid); + dispatch(initializePublicAccessForm(permissionLinks)); - const getFullname = (tailUuid: string) => { - const user = users.find(({ uuid }) => uuid === tailUuid); - const group = groups.find(({ uuid }) => uuid === tailUuid); - return user - ? (user as UserResource & {fullName: string}).fullName - : group - ? group.name - : tailUuid; - }; + const queryusers = permissionLinks.map(({ tailUuid }) => tailUuid) + .filter(uuid => extractUuidObjectType(uuid) === ResourceObjectType.USER); + const querygroups = permissionLinks.map(({ tailUuid }) => tailUuid) + .filter(uuid => extractUuidObjectType(uuid) === ResourceObjectType.GROUP); - const managementPermissions = permissionLinks - .map(({ tailUuid, name, uuid }) => ({ - email: getEmail(tailUuid), - fullName: getFullname(tailUuid), - permissions: name as PermissionLevel, - permissionUuid: uuid, - })); + const userfilters = new FilterBuilder() + .addIn('uuid', Array.from(new Set(queryusers))) + .getFilters(); + const groupfilters = new FilterBuilder() + .addIn('uuid', Array.from(new Set(querygroups))) + .getFilters(); - const managementFormData: SharingManagementFormData = { - permissions: managementPermissions, - initialPermissions: managementPermissions, - }; + const userpromise = queryusers.length > 0 ? userService.list({ filters: userfilters, count: "none", limit: 1000 }) : Promise.resolve({items: ([] as Array)}); + const grouppromise = querygroups.length > 0 ? groupsService.list({ filters: groupfilters, count: "none", limit: 1000 }) : Promise.resolve({items: ([] as Array)}); - dispatch(initialize(SHARING_MANAGEMENT_FORM_NAME, managementFormData)); - dispatch(progressIndicatorActions.STOP_WORKING(SHARING_DIALOG_NAME)); + const results = await Promise.all([userpromise, grouppromise]); + + const users = (results[0] as ListResults).items; + const groups = (results[1] as ListResults).items; + + const getEmail = (tailUuid: string) => { + const user = users.find(({ uuid }) => uuid === tailUuid); + return user + ? (user as UserResource).email + : null; + }; + + const getFullname = (tailUuid: string) => { + const user = users.find(({ uuid }) => uuid === tailUuid); + const group = groups.find(({ uuid }) => uuid === tailUuid); + return user + ? (user as UserResource & {fullName: string}).fullName + : group + ? (group as GroupResource).name + : tailUuid; + }; + + const managementPermissions = permissionLinks + .map(({ tailUuid, name, uuid }) => ({ + email: getEmail(tailUuid), + fullName: getFullname(tailUuid), + permissions: name as PermissionLevel, + permissionUuid: uuid, + })); + + const managementFormData: SharingManagementFormData = { + permissions: managementPermissions, + initialPermissions: managementPermissions, + }; + + dispatch(initialize(SHARING_MANAGEMENT_FORM_NAME, managementFormData)); + } finally { + dispatch(progressIndicatorActions.STOP_WORKING(SHARING_DIALOG_NAME)); + } }; const initializePublicAccessForm = (permissionLinks: PermissionResource[]) => -- 2.39.5