Files
outline/server/commands/userDestroyer.ts
Tom Moor 15b1069bcc chore: Move to Typescript (#2783)
This PR moves the entire project to Typescript. Due to the ~1000 ignores this will lead to a messy codebase for a while, but the churn is worth it – all of those ignore comments are places that were never type-safe previously.

closes #1282
2021-11-29 06:40:55 -08:00

75 lines
1.6 KiB
TypeScript

import { Event, User } from "@server/models";
import { ValidationError } from "../errors";
import { Op, sequelize } from "../sequelize";
export default async function userDestroyer({
user,
actor,
ip,
}: {
// @ts-expect-error ts-migrate(2749) FIXME: 'User' refers to a value, but is being used as a t... Remove this comment to see the full error message
user: User;
// @ts-expect-error ts-migrate(2749) FIXME: 'User' refers to a value, but is being used as a t... Remove this comment to see the full error message
actor: User;
ip: string;
}) {
const { teamId } = user;
const usersCount = await User.count({
where: {
teamId,
},
});
if (usersCount === 1) {
throw ValidationError("Cannot delete last user on the team.");
}
if (user.isAdmin) {
const otherAdminsCount = await User.count({
where: {
isAdmin: true,
teamId,
id: {
[Op.ne]: user.id,
},
},
});
if (otherAdminsCount === 0) {
throw ValidationError(
"Cannot delete account as only admin. Please make another user admin and try again."
);
}
}
const transaction = await sequelize.transaction();
let response;
try {
response = await user.destroy({
transaction,
});
await Event.create(
{
name: "users.delete",
actorId: actor.id,
userId: user.id,
teamId,
data: {
name: user.name,
},
ip,
},
{
transaction,
}
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
return response;
}