implement update user, update password and delete account

This commit is contained in:
m5r
2021-09-25 07:09:20 +08:00
parent 12983316f5
commit c9b657e44c
11 changed files with 220 additions and 83 deletions

View File

@ -0,0 +1,72 @@
import { Queue } from "quirrel/blitz";
import db, { MembershipRole } from "../../../../db";
import appLogger from "../../../../integrations/logger";
const logger = appLogger.child({ queue: "delete-user-data" });
type Payload = {
userId: string;
};
const deleteUserData = Queue<Payload>("api/queue/delete-user-data", async ({ userId }) => {
const user = await db.user.findFirst({
where: { id: userId },
include: {
memberships: {
include: {
organization: {
include: { memberships: { include: { user: true } } },
},
},
},
},
});
if (!user) {
return;
}
switch (user.memberships[0]!.role) {
case MembershipRole.OWNER: {
const organization = user.memberships[0]!.organization;
const where = { organizationId: organization.id };
await Promise.all<unknown>([
db.notificationSubscription.deleteMany({ where }),
db.phoneCall.deleteMany({ where }),
db.message.deleteMany({ where }),
db.processingPhoneNumber.deleteMany({ where }),
]);
await db.phoneNumber.deleteMany({ where });
const orgMembers = organization.memberships
.map((membership) => membership.user!)
.filter((user) => user !== null);
await Promise.all(
orgMembers.map((member) =>
Promise.all([
db.token.deleteMany({ where: { userId: member.id } }),
db.session.deleteMany({ where: { userId: member.id } }),
db.membership.deleteMany({ where: { userId: member.id } }),
db.user.delete({ where: { id: member.id } }),
]),
),
);
await db.organization.delete({ where: { id: organization.id } });
break;
}
case MembershipRole.USER: {
await Promise.all([
db.token.deleteMany({ where: { userId: user.id } }),
db.session.deleteMany({ where: { userId: user.id } }),
db.user.delete({ where: { id: user.id } }),
db.membership.deleteMany({ where: { userId: user.id } }),
]);
break;
}
case MembershipRole.ADMIN:
// nothing to do here?
break;
}
});
export default deleteUserData;

View File

@ -0,0 +1,28 @@
import { Queue } from "quirrel/blitz";
import appLogger from "../../../../integrations/logger";
import { sendEmail } from "../../../../integrations/ses";
const logger = appLogger.child({ queue: "notify-email-change" });
type Payload = {
oldEmail: string;
newEmail: string;
};
const notifyEmailChangeQueue = Queue<Payload>("api/queue/notify-email-change", async ({ oldEmail, newEmail }) => {
await Promise.all([
sendEmail({
recipients: [oldEmail],
subject: "",
body: "",
}),
sendEmail({
recipients: [newEmail],
subject: "",
body: "",
}),
]);
});
export default notifyEmailChangeQueue;