From c57b51755552648842a37df61b86d84d81fbdcdb Mon Sep 17 00:00:00 2001 From: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com> Date: Thu, 5 Feb 2026 22:41:57 +0530 Subject: [PATCH] optimize organization member removal (#27660) --- .../features/ee/teams/services/teamService.ts | 83 +++++++++++-------- 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/packages/features/ee/teams/services/teamService.ts b/packages/features/ee/teams/services/teamService.ts index cb93ab7c86..ccce15abd0 100644 --- a/packages/features/ee/teams/services/teamService.ts +++ b/packages/features/ee/teams/services/teamService.ts @@ -508,58 +508,73 @@ export class TeamService { await TeamService.cleanupTempOrgRedirect(user, team); const newUsername = generateNewUsername(user); - await prisma.$transaction([ - // Remove user from all sub-teams event type hosts - prisma.host.deleteMany({ - where: { - userId: membership.userId, - eventType: { - team: { - parentId: team.id, + const subTeamIds = await prisma.team.findMany({ + where: { + parentId: team.id, + }, + select: { + id: true, + }, + }); + const subTeamIdArray = subTeamIds.map((t) => t.id); + + await prisma.$transaction(async (tx) => { + if (subTeamIdArray.length > 0) { + // Remove user from all sub-teams event type hosts + await tx.host.deleteMany({ + where: { + userId: membership.userId, + eventType: { + teamId: { + in: subTeamIdArray, + }, }, }, - }, - }), - // Delete managed child events in sub-teams - prisma.eventType.deleteMany({ - where: { - userId: membership.userId, - parent: { - team: { - parentId: team.id, + }); + // Delete managed child events in sub-teams + await tx.eventType.deleteMany({ + where: { + userId: membership.userId, + parent: { + teamId: { + in: subTeamIdArray, + }, }, }, - }, - }), + }); + // Delete all sub-team memberships where this team is the organization + await tx.membership.deleteMany({ + where: { + teamId: { + in: subTeamIdArray, + }, + userId: membership.userId, + }, + }); + } + // Remove organizationId from the user - prisma.user.update({ + await tx.user.update({ where: { id: membership.userId }, data: { organizationId: null, username: newUsername, }, - }), + }); // Delete the profile of the user from the organization - ProfileRepository.delete({ - userId: membership.userId, - organizationId: team.id, - }), - // Delete all sub-team memberships where this team is the organization - prisma.membership.deleteMany({ + await tx.profile.deleteMany({ where: { - team: { - parentId: team.id, - }, userId: membership.userId, + organizationId: team.id, }, - }), + }); // Delete the membership of the user from the organization - prisma.membership.delete({ + await tx.membership.delete({ where: { userId_teamId: { userId: membership.userId, teamId: team.id }, }, - }), - ]); + }); + }); // Generate new username for user leaving organization function generateNewUsername(user: UserWithTeams): string | null {