From 8c85029d55f12f90ad8e6f7e958677ba0664292a Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Mon, 13 Nov 2023 22:06:24 -0500 Subject: [PATCH] Improve reliability of team deletion --- server/commands/teamPermanentDeleter.ts | 2 +- server/queues/tasks/CleanupDeletedTeamTask.ts | 25 +++++++++++++++++++ .../queues/tasks/CleanupDeletedTeamsTask.ts | 8 +++--- 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 server/queues/tasks/CleanupDeletedTeamTask.ts diff --git a/server/commands/teamPermanentDeleter.ts b/server/commands/teamPermanentDeleter.ts index 53e83f30a..72f41bfd3 100644 --- a/server/commands/teamPermanentDeleter.ts +++ b/server/commands/teamPermanentDeleter.ts @@ -29,7 +29,7 @@ async function teamPermanentDeleter(team: Team) { Logger.info( "commands", - `Permanently deleting team ${team.name} (${team.id})` + `Permanently destroying team ${team.name} (${team.id})` ); const teamId = team.id; let transaction!: Transaction; diff --git a/server/queues/tasks/CleanupDeletedTeamTask.ts b/server/queues/tasks/CleanupDeletedTeamTask.ts new file mode 100644 index 000000000..540a2c022 --- /dev/null +++ b/server/queues/tasks/CleanupDeletedTeamTask.ts @@ -0,0 +1,25 @@ +import teamPermanentDeleter from "@server/commands/teamPermanentDeleter"; +import { Team } from "@server/models"; +import BaseTask, { TaskPriority } from "./BaseTask"; + +type Props = { + /** The team ID to permanantly destroy */ + teamId: string; +}; + +export default class CleanupDeletedTeamTask extends BaseTask { + public async perform({ teamId }: Props) { + const team = await Team.findByPk(teamId, { + paranoid: false, + rejectOnEmpty: true, + }); + await teamPermanentDeleter(team); + } + + public get options() { + return { + attempts: 1, + priority: TaskPriority.Background, + }; + } +} diff --git a/server/queues/tasks/CleanupDeletedTeamsTask.ts b/server/queues/tasks/CleanupDeletedTeamsTask.ts index f9c1cd3da..403ee684d 100644 --- a/server/queues/tasks/CleanupDeletedTeamsTask.ts +++ b/server/queues/tasks/CleanupDeletedTeamsTask.ts @@ -1,9 +1,9 @@ import { subDays } from "date-fns"; import { Op } from "sequelize"; -import teamPermanentDeleter from "@server/commands/teamPermanentDeleter"; import Logger from "@server/logging/Logger"; import { Team } from "@server/models"; import BaseTask, { TaskPriority, TaskSchedule } from "./BaseTask"; +import CleanupDeletedTeamTask from "./CleanupDeletedTeamTask"; type Props = { limit: number; @@ -18,6 +18,7 @@ export default class CleanupDeletedTeamsTask extends BaseTask { `Permanently destroying upto ${limit} teams older than 30 days…` ); const teams = await Team.findAll({ + attributes: ["id"], where: { deletedAt: { [Op.lt]: subDays(new Date(), 30), @@ -28,9 +29,10 @@ export default class CleanupDeletedTeamsTask extends BaseTask { }); for (const team of teams) { - await teamPermanentDeleter(team); + await CleanupDeletedTeamTask.schedule({ + teamId: team.id, + }); } - Logger.info("task", `Destroyed ${teams.length} teams`); } public get options() {