From b311c40feada67f7537800e9987b6d23e5eb4203 Mon Sep 17 00:00:00 2001 From: Vivian Date: Mon, 28 Aug 2023 10:54:21 -0700 Subject: [PATCH 1/5] fix: add shareContent to group business rules affects: @esri/hub-common --- packages/common/src/groups/_internal/GroupBusinessRules.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/common/src/groups/_internal/GroupBusinessRules.ts b/packages/common/src/groups/_internal/GroupBusinessRules.ts index 2d53b02887b..626ea80dcd4 100644 --- a/packages/common/src/groups/_internal/GroupBusinessRules.ts +++ b/packages/common/src/groups/_internal/GroupBusinessRules.ts @@ -19,6 +19,7 @@ export const GroupPermissions = [ "hub:group:workspace:collaborators", "hub:group:workspace:content", "hub:group:workspace:members", + "hub:group:shareContent", ] as const; /** @@ -74,4 +75,10 @@ export const GroupPermissionPolicies: IPermissionPolicy[] = [ permission: "hub:group:workspace:members", dependencies: ["hub:group:view"], }, + { + permission: "hub:group:shareContent", + dependencies: ["hub:group"], + authenticated: true, + privileges: ["portal:user:shareToGroup"], + }, ]; From 47407b7e9259d459268f5be858956e8d0a702829 Mon Sep 17 00:00:00 2001 From: Vivian Date: Mon, 28 Aug 2023 10:54:57 -0700 Subject: [PATCH 2/5] fix: clean up hub group related code affects: @esri/hub-common --- packages/common/src/core/types/IHubGroup.ts | 2 +- packages/common/src/groups/HubGroup.ts | 7 ++----- packages/common/src/groups/_internal/computeProps.ts | 2 ++ 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/common/src/core/types/IHubGroup.ts b/packages/common/src/core/types/IHubGroup.ts index 70735175314..b2f9595da13 100644 --- a/packages/common/src/core/types/IHubGroup.ts +++ b/packages/common/src/core/types/IHubGroup.ts @@ -79,7 +79,7 @@ export interface IHubGroup extends IHubEntityBase, IWithPermissions { owner?: string; /** - * Whether the group is protect or not + * Whether the group is protected or not * the group cannot be deleted if protected */ protected: boolean; diff --git a/packages/common/src/groups/HubGroup.ts b/packages/common/src/groups/HubGroup.ts index 445a41db33e..dbb0daeb03d 100644 --- a/packages/common/src/groups/HubGroup.ts +++ b/packages/common/src/groups/HubGroup.ts @@ -54,15 +54,12 @@ export class HubGroup * only the owner or admins of the group can */ get canEdit(): boolean { - if ( + return ( (this.entity.memberType && (this.entity.memberType === "owner" || this.entity.memberType === "admin")) || this.entity.owner === this.context.currentUser.username - ) { - return true; - } - return false; + ); } /** diff --git a/packages/common/src/groups/_internal/computeProps.ts b/packages/common/src/groups/_internal/computeProps.ts index 9ed583e783f..6b83168ef41 100644 --- a/packages/common/src/groups/_internal/computeProps.ts +++ b/packages/common/src/groups/_internal/computeProps.ts @@ -47,6 +47,8 @@ export function computeProps( "updateitemcontrol" ); + hubGroup.memberType = group.userMembership.memberType; + hubGroup.membershipAccess = "anyone"; if (group.membershipAccess === "org") { hubGroup.membershipAccess = "organization"; From e33ce7b0acff9ca427cb203461741b9036de2cd2 Mon Sep 17 00:00:00 2001 From: Vivian Date: Wed, 30 Aug 2023 10:32:08 -0700 Subject: [PATCH 3/5] chore: add group member check to group shareContent affects: @esri/hub-common --- packages/common/src/groups/_internal/GroupBusinessRules.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/common/src/groups/_internal/GroupBusinessRules.ts b/packages/common/src/groups/_internal/GroupBusinessRules.ts index 626ea80dcd4..5729212c2f8 100644 --- a/packages/common/src/groups/_internal/GroupBusinessRules.ts +++ b/packages/common/src/groups/_internal/GroupBusinessRules.ts @@ -80,5 +80,12 @@ export const GroupPermissionPolicies: IPermissionPolicy[] = [ dependencies: ["hub:group"], authenticated: true, privileges: ["portal:user:shareToGroup"], + assertions: [ + { + property: "context:currentUser", + type: "is-group-member", + value: "entity:id", + }, + ], }, ]; From 7aafe6c7fe821feda75b16c9028d633ef319d546 Mon Sep 17 00:00:00 2001 From: Vivian Date: Wed, 30 Aug 2023 11:14:00 -0700 Subject: [PATCH 4/5] chore: guard userMembership affects: @esri/hub-common --- packages/common/src/groups/_internal/computeProps.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/common/src/groups/_internal/computeProps.ts b/packages/common/src/groups/_internal/computeProps.ts index 6b83168ef41..edeb7b0497a 100644 --- a/packages/common/src/groups/_internal/computeProps.ts +++ b/packages/common/src/groups/_internal/computeProps.ts @@ -47,7 +47,7 @@ export function computeProps( "updateitemcontrol" ); - hubGroup.memberType = group.userMembership.memberType; + hubGroup.memberType = group.userMembership?.memberType; hubGroup.membershipAccess = "anyone"; if (group.membershipAccess === "org") { @@ -58,8 +58,8 @@ export function computeProps( } hubGroup.canEdit = - group.userMembership.memberType === "owner" || - group.userMembership.memberType === "admin"; + group.userMembership?.memberType === "owner" || + group.userMembership?.memberType === "admin"; hubGroup.canDelete = hubGroup.canEdit; // cast b/c this takes a partial but returns a full group From 0d6ad6d82c9f968da36abd667c96d22cc3727a4d Mon Sep 17 00:00:00 2001 From: Vivian Date: Fri, 1 Sep 2023 10:57:37 -0700 Subject: [PATCH 5/5] chore: tests affects: @esri/hub-common --- .../test/groups/_internal/computeProps.test.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/common/test/groups/_internal/computeProps.test.ts b/packages/common/test/groups/_internal/computeProps.test.ts index b6406ca2563..e57236e0376 100644 --- a/packages/common/test/groups/_internal/computeProps.test.ts +++ b/packages/common/test/groups/_internal/computeProps.test.ts @@ -86,6 +86,20 @@ describe("groups: computeProps:", () => { "https://org.maps.arcgis.com/sharing/rest/community/groups/3ef/info/group.jpg" ); }); + it("computes the correct props when no userMembership", () => { + group = { + id: "3ef", + name: "Test group", + } as unknown as IGroup; + const chk = computeProps( + group, + hubGroup, + authdCtxMgr.context.requestOptions + ); + expect(chk.memberType).toBeFalsy(); + expect(chk.canEdit).toBeFalsy(); + expect(chk.canDelete).toBeFalsy(); + }); }); }); });