52 lines
1.1 KiB
TypeScript
52 lines
1.1 KiB
TypeScript
import { MembershipRole } from "@prisma/client";
|
|
|
|
import { Queue } from "~/utils/queue.server";
|
|
import db from "~/utils/db.server";
|
|
import logger from "~/utils/logger.server";
|
|
import { deleteOrganizationEntities } from "~/utils/organization.server";
|
|
|
|
type Payload = {
|
|
userId: string;
|
|
};
|
|
|
|
export default Queue<Payload>("delete user data", async ({ data }) => {
|
|
const { userId } = data;
|
|
const user = await db.user.findUnique({
|
|
where: { id: userId },
|
|
include: {
|
|
memberships: {
|
|
include: { organization: true },
|
|
},
|
|
},
|
|
});
|
|
if (!user) {
|
|
return;
|
|
}
|
|
|
|
await Promise.all(
|
|
user.memberships.map(async (membership) => {
|
|
switch (membership.role) {
|
|
case MembershipRole.OWNER: {
|
|
await deleteOrganizationEntities(membership.organization);
|
|
break;
|
|
}
|
|
case MembershipRole.USER: {
|
|
await db.membership.delete({ where: { id: membership.id } });
|
|
break;
|
|
}
|
|
}
|
|
}),
|
|
);
|
|
|
|
try {
|
|
await db.user.delete({ where: { id: user.id } });
|
|
} catch (error: any) {
|
|
if (error.code === "P2025") {
|
|
logger.warn("Could not delete user because it has already been deleted");
|
|
return;
|
|
}
|
|
|
|
throw error;
|
|
}
|
|
});
|