From 56f8245cf3810ee2e659e6c708e5fbb0ef7c62db Mon Sep 17 00:00:00 2001 From: = Date: Fri, 21 Nov 2025 01:58:53 +0530 Subject: [PATCH 1/2] fix: resolved duplicate membership in identity --- .../membership-group/membership-group-service.ts | 10 ++++++++++ .../membership-identity/membership-identity-service.ts | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/backend/src/services/membership-group/membership-group-service.ts b/backend/src/services/membership-group/membership-group-service.ts index 0aedccd15..509bd9ff3 100644 --- a/backend/src/services/membership-group/membership-group-service.ts +++ b/backend/src/services/membership-group/membership-group-service.ts @@ -93,6 +93,16 @@ export const membershipGroupServiceFactory = ({ } const scopeDatabaseFields = factory.getScopeDatabaseFields(dto.scopeData); + const existingMembership = await membershipGroupDAL.findOne({ + scope: scopeData.scope, + ...scopeDatabaseFields, + actorGroupId: dto.data.groupId + }); + if (existingMembership) + throw new BadRequestError({ + message: "Group is already a member" + }); + await factory.onCreateMembershipGroupGuard(dto); const customInputRoles = data.roles.filter((el) => factory.isCustomRole(el.role)); diff --git a/backend/src/services/membership-identity/membership-identity-service.ts b/backend/src/services/membership-identity/membership-identity-service.ts index ab63c4508..841c73bd7 100644 --- a/backend/src/services/membership-identity/membership-identity-service.ts +++ b/backend/src/services/membership-identity/membership-identity-service.ts @@ -102,6 +102,16 @@ export const membershipIdentityServiceFactory = ({ throw new NotFoundError({ message: "One or more custom roles not found" }); } + const existingMembership = await membershipIdentityDAL.findOne({ + scope: scopeData.scope, + ...scopeDatabaseFields, + actorIdentityId: dto.data.identityId + }); + if (existingMembership) + throw new BadRequestError({ + message: "Identity is already a member" + }); + const customRolesGroupBySlug = groupBy(customRoles, ({ slug }) => slug); const membership = await membershipIdentityDAL.transaction(async (tx) => { From 36059051b1b49efcb8badc01a99e7f29e01c81f9 Mon Sep 17 00:00:00 2001 From: Carlos Monastyrski Date: Thu, 20 Nov 2025 18:11:46 -0300 Subject: [PATCH 2/2] Fix race condition on identity/group membership check --- .../membership-group-service.ts | 22 ++++++++++-------- .../membership-identity-service.ts | 23 +++++++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/backend/src/services/membership-group/membership-group-service.ts b/backend/src/services/membership-group/membership-group-service.ts index 509bd9ff3..767daab31 100644 --- a/backend/src/services/membership-group/membership-group-service.ts +++ b/backend/src/services/membership-group/membership-group-service.ts @@ -93,15 +93,6 @@ export const membershipGroupServiceFactory = ({ } const scopeDatabaseFields = factory.getScopeDatabaseFields(dto.scopeData); - const existingMembership = await membershipGroupDAL.findOne({ - scope: scopeData.scope, - ...scopeDatabaseFields, - actorGroupId: dto.data.groupId - }); - if (existingMembership) - throw new BadRequestError({ - message: "Group is already a member" - }); await factory.onCreateMembershipGroupGuard(dto); @@ -122,6 +113,19 @@ export const membershipGroupServiceFactory = ({ const customRolesGroupBySlug = groupBy(customRoles, ({ slug }) => slug); const membership = await membershipGroupDAL.transaction(async (tx) => { + const existingMembership = await membershipGroupDAL.findOne( + { + scope: scopeData.scope, + ...scopeDatabaseFields, + actorGroupId: dto.data.groupId + }, + tx + ); + if (existingMembership) + throw new BadRequestError({ + message: "Group is already a member" + }); + const doc = await membershipGroupDAL.create( { scope: scopeData.scope, diff --git a/backend/src/services/membership-identity/membership-identity-service.ts b/backend/src/services/membership-identity/membership-identity-service.ts index 841c73bd7..b1dd6e238 100644 --- a/backend/src/services/membership-identity/membership-identity-service.ts +++ b/backend/src/services/membership-identity/membership-identity-service.ts @@ -102,19 +102,22 @@ export const membershipIdentityServiceFactory = ({ throw new NotFoundError({ message: "One or more custom roles not found" }); } - const existingMembership = await membershipIdentityDAL.findOne({ - scope: scopeData.scope, - ...scopeDatabaseFields, - actorIdentityId: dto.data.identityId - }); - if (existingMembership) - throw new BadRequestError({ - message: "Identity is already a member" - }); - const customRolesGroupBySlug = groupBy(customRoles, ({ slug }) => slug); const membership = await membershipIdentityDAL.transaction(async (tx) => { + const existingMembership = await membershipIdentityDAL.findOne( + { + scope: scopeData.scope, + ...scopeDatabaseFields, + actorIdentityId: dto.data.identityId + }, + tx + ); + if (existingMembership) + throw new BadRequestError({ + message: "Identity is already a member" + }); + const doc = await membershipIdentityDAL.create( { scope: scopeData.scope,