Co-authored-by: Alex van Andel <me@alexvanandel.com> Co-authored-by: Keith Williams <keithwillcode@gmail.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: Joe Au-Yeung <j.auyeung419@gmail.com> Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
118 lines
2.8 KiB
TypeScript
118 lines
2.8 KiB
TypeScript
import logger from "@calcom/lib/logger";
|
|
import { ProfileRepository } from "@calcom/lib/server/repository/profile";
|
|
import prisma from "@calcom/prisma";
|
|
|
|
import { TRPCError } from "@trpc/server";
|
|
|
|
const log = logger.getSubLogger({ prefix: ["removeMember"] });
|
|
|
|
const removeMember = async ({
|
|
memberId,
|
|
teamId,
|
|
isOrg,
|
|
}: {
|
|
memberId: number;
|
|
teamId: number;
|
|
isOrg: boolean;
|
|
}) => {
|
|
const [membership] = await prisma.$transaction([
|
|
prisma.membership.delete({
|
|
where: {
|
|
userId_teamId: { userId: memberId, teamId: teamId },
|
|
},
|
|
include: {
|
|
user: true,
|
|
team: true,
|
|
},
|
|
}),
|
|
// remove user as host from team events associated with this membership
|
|
prisma.host.deleteMany({
|
|
where: {
|
|
userId: memberId,
|
|
eventType: {
|
|
teamId: teamId,
|
|
},
|
|
},
|
|
}),
|
|
]);
|
|
|
|
if (isOrg) {
|
|
log.debug("Removing a member from the organization");
|
|
|
|
// Deleting membership from all child teams
|
|
const foundUser = await prisma.user.findUnique({
|
|
where: { id: memberId },
|
|
select: {
|
|
id: true,
|
|
movedToProfileId: true,
|
|
email: true,
|
|
username: true,
|
|
completedOnboarding: true,
|
|
},
|
|
});
|
|
|
|
const orgInfo = await prisma.team.findUnique({
|
|
where: { id: teamId },
|
|
select: {
|
|
isOrganization: true,
|
|
organizationSettings: true,
|
|
id: true,
|
|
metadata: true,
|
|
},
|
|
});
|
|
const orgMetadata = orgInfo?.organizationSettings;
|
|
|
|
if (!foundUser || !orgInfo) throw new TRPCError({ code: "NOT_FOUND" });
|
|
|
|
// Delete all sub-team memberships where this team is the organization
|
|
await prisma.membership.deleteMany({
|
|
where: {
|
|
team: {
|
|
parentId: teamId,
|
|
},
|
|
userId: membership.userId,
|
|
},
|
|
});
|
|
|
|
const userToDeleteMembershipOf = foundUser;
|
|
|
|
const profileToDelete = await ProfileRepository.findByUserIdAndOrgId({
|
|
userId: userToDeleteMembershipOf.id,
|
|
organizationId: orgInfo.id,
|
|
});
|
|
|
|
if (
|
|
userToDeleteMembershipOf.username &&
|
|
userToDeleteMembershipOf.movedToProfileId === profileToDelete?.id
|
|
) {
|
|
log.debug("Cleaning up tempOrgRedirect for user", userToDeleteMembershipOf.username);
|
|
|
|
await prisma.tempOrgRedirect.deleteMany({
|
|
where: {
|
|
from: userToDeleteMembershipOf.username,
|
|
},
|
|
});
|
|
}
|
|
|
|
await prisma.$transaction([
|
|
prisma.user.update({
|
|
where: { id: membership.userId },
|
|
data: { organizationId: null },
|
|
}),
|
|
ProfileRepository.delete({
|
|
userId: membership.userId,
|
|
organizationId: orgInfo.id,
|
|
}),
|
|
]);
|
|
}
|
|
|
|
// Deleted managed event types from this team from this member
|
|
await prisma.eventType.deleteMany({
|
|
where: { parent: { teamId: teamId }, userId: membership.userId },
|
|
});
|
|
|
|
return { membership };
|
|
};
|
|
|
|
export default removeMember;
|