132 lines
3.1 KiB
TypeScript
132 lines
3.1 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";
|
||
|
|
|
||
|
|
import { deleteWorkfowRemindersOfRemovedMember } from "./deleteWorkflowRemindersOfRemovedMember";
|
||
|
|
|
||
|
|
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,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
}),
|
||
|
|
]);
|
||
|
|
|
||
|
|
const team = await prisma.team.findUnique({
|
||
|
|
where: { id: teamId },
|
||
|
|
select: {
|
||
|
|
isOrganization: true,
|
||
|
|
organizationSettings: true,
|
||
|
|
id: true,
|
||
|
|
metadata: true,
|
||
|
|
activeOrgWorkflows: true,
|
||
|
|
parentId: true,
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
const foundUser = await prisma.user.findUnique({
|
||
|
|
where: { id: memberId },
|
||
|
|
select: {
|
||
|
|
id: true,
|
||
|
|
movedToProfileId: true,
|
||
|
|
email: true,
|
||
|
|
username: true,
|
||
|
|
completedOnboarding: true,
|
||
|
|
teams: {
|
||
|
|
select: {
|
||
|
|
team: {
|
||
|
|
select: {
|
||
|
|
id: true,
|
||
|
|
parentId: true,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!team || !foundUser) throw new TRPCError({ code: "NOT_FOUND" });
|
||
|
|
|
||
|
|
if (isOrg) {
|
||
|
|
log.debug("Removing a member from the organization");
|
||
|
|
// Deleting membership from all child teams
|
||
|
|
// 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: team.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: team.id,
|
||
|
|
}),
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Deleted managed event types from this team from this member
|
||
|
|
await prisma.eventType.deleteMany({
|
||
|
|
where: { parent: { teamId: teamId }, userId: membership.userId },
|
||
|
|
});
|
||
|
|
|
||
|
|
await deleteWorkfowRemindersOfRemovedMember(team, memberId, isOrg);
|
||
|
|
|
||
|
|
return { membership };
|
||
|
|
};
|
||
|
|
|
||
|
|
export default removeMember;
|