From d8bc9acbbc80d923a0d4e728872a023f7dd42c60 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Thu, 22 Jun 2023 21:33:03 +0200 Subject: [PATCH] feat: remove member from hosts on removal (#9722) * feat: When a member is removed we should remove it from the hosts * Add migration for fixing old records affected --- .../ee/teams/components/MemberListItem.tsx | 10 +++++----- .../migration.sql | 16 ++++++++++++++++ .../viewer/teams/removeMember.handler.ts | 17 +++++++++++++---- 3 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 packages/prisma/migrations/20230622164946_remove_host_remnants_from_old_team_members/migration.sql diff --git a/packages/features/ee/teams/components/MemberListItem.tsx b/packages/features/ee/teams/components/MemberListItem.tsx index 6fe87a7633..7361c1f5df 100644 --- a/packages/features/ee/teams/components/MemberListItem.tsx +++ b/packages/features/ee/teams/components/MemberListItem.tsx @@ -27,7 +27,7 @@ import { showToast, Tooltip, } from "@calcom/ui"; -import { ExternalLink, MoreHorizontal, Edit2, Lock, Trash } from "@calcom/ui/components/icon"; +import { ExternalLink, MoreHorizontal, Edit2, Lock, UserX } from "@calcom/ui/components/icon"; import MemberChangeRoleModal from "./MemberChangeRoleModal"; import TeamAvailabilityModal from "./TeamAvailabilityModal"; @@ -212,8 +212,8 @@ export default function MemberListItem(props: Props) { type="button" onClick={() => setShowDeleteModal(true)} color="destructive" - StartIcon={Trash}> - {t("delete")} + StartIcon={UserX}> + {t("remove")} @@ -246,8 +246,8 @@ export default function MemberListItem(props: Props) { type="button" color="destructive" onClick={() => setShowDeleteModal(true)} - StartIcon={Trash}> - {t("delete")} + StartIcon={UserX}> + {t("remove")} diff --git a/packages/prisma/migrations/20230622164946_remove_host_remnants_from_old_team_members/migration.sql b/packages/prisma/migrations/20230622164946_remove_host_remnants_from_old_team_members/migration.sql new file mode 100644 index 0000000000..a8a4063a7e --- /dev/null +++ b/packages/prisma/migrations/20230622164946_remove_host_remnants_from_old_team_members/migration.sql @@ -0,0 +1,16 @@ + +DELETE FROM "Host" +WHERE "Host"."userId" IN ( + SELECT "Host"."userId" FROM "Host" + LEFT JOIN "Membership" ON "Membership"."userId" = "Host"."userId" + INNER JOIN "EventType" ON "EventType"."id" = "Host"."eventTypeId" + WHERE "EventType"."teamId" IS NOT NULL + AND "Membership"."userId" IS NULL +) +AND "Host"."eventTypeId" IN ( + SELECT "Host"."eventTypeId" FROM "Host" + LEFT JOIN "Membership" ON "Membership"."userId" = "Host"."userId" + INNER JOIN "EventType" ON "EventType"."id" = "Host"."eventTypeId" + WHERE "EventType"."teamId" IS NOT NULL + AND "Membership"."userId" IS NULL +); \ No newline at end of file diff --git a/packages/trpc/server/routers/viewer/teams/removeMember.handler.ts b/packages/trpc/server/routers/viewer/teams/removeMember.handler.ts index 037c589594..f6fb0b6a88 100644 --- a/packages/trpc/server/routers/viewer/teams/removeMember.handler.ts +++ b/packages/trpc/server/routers/viewer/teams/removeMember.handler.ts @@ -4,7 +4,6 @@ import { updateQuantitySubscriptionFromStripe } from "@calcom/features/ee/teams/ import { IS_TEAM_BILLING_ENABLED } from "@calcom/lib/constants"; import { isTeamAdmin, isTeamOwner } from "@calcom/lib/server/queries/teams"; import { closeComDeleteTeamMembership } from "@calcom/lib/sync/SyncServiceManager"; -import { prisma } from "@calcom/prisma"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; import { TRPCError } from "@trpc/server"; @@ -32,7 +31,7 @@ export const removeMemberHandler = async ({ ctx, input }: RemoveMemberOptions) = message: "You can not remove yourself from a team you own.", }); - const membership = await prisma.membership.delete({ + const membership = await ctx.prisma.membership.delete({ where: { userId_teamId: { userId: input.memberId, teamId: input.teamId }, }, @@ -41,9 +40,19 @@ export const removeMemberHandler = async ({ ctx, input }: RemoveMemberOptions) = }, }); + // remove user as host from team events associated with this membership + await ctx.prisma.host.deleteMany({ + where: { + userId: input.memberId, + eventType: { + teamId: input.teamId, + }, + }, + }); + if (input.isOrg) { // Deleting membership from all child teams - await prisma.membership.deleteMany({ + await ctx.prisma.membership.deleteMany({ where: { team: { parentId: input.teamId, @@ -52,7 +61,7 @@ export const removeMemberHandler = async ({ ctx, input }: RemoveMemberOptions) = }, }); - await prisma.user.update({ + await ctx.prisma.user.update({ where: { id: membership.userId }, data: { organizationId: null }, });