From e59527bc787c18b7c15fa402fc38525a3e424c00 Mon Sep 17 00:00:00 2001 From: tdurieux Date: Thu, 7 May 2026 06:04:55 +0300 Subject: [PATCH] Remove all user repositories when banning Use removeQueue instead of cacheQueue so each repo transitions to REMOVING status and is fully deleted, not just cache-cleared. --- src/server/routes/admin.ts | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/server/routes/admin.ts b/src/server/routes/admin.ts index 3aebf0c..59e08a5 100644 --- a/src/server/routes/admin.ts +++ b/src/server/routes/admin.ts @@ -810,14 +810,28 @@ router.post( "/users/:username/ban", async (req: express.Request, res: express.Response) => { try { - const result = await UserModel.updateOne( - { username: req.params.username }, - { $set: { status: "banned" } } - ); - if (result.matchedCount === 0) { + const user = await UserModel.findOne({ username: req.params.username }); + if (!user) { throw new AnonymousError("user_not_found", { httpStatus: 404 }); } - res.json({ ok: true }); + await UserModel.updateOne( + { _id: user._id }, + { $set: { status: "banned" } } + ); + const repos = await AnonymizedRepositoryModel.find( + { owner: user._id, status: { $nin: ["removed", "removing"] } }, + { repoId: 1 } + ).lean(); + let queued = 0; + for (const repo of repos) { + try { + await removeQueue.add(repo.repoId, { repoId: repo.repoId }, { jobId: `repo-${repo.repoId}` }); + queued++; + } catch { + // job may already exist in the queue + } + } + res.json({ ok: true, reposQueued: queued }); } catch (error) { handleError(error, res, req); }