From 5d38be10e75d4e0f1565bf61fb89fd571212b75e Mon Sep 17 00:00:00 2001 From: Luke Vella Date: Mon, 10 Mar 2025 11:10:36 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Delete=20polls=20in=20batches=20?= =?UTF-8?q?to=20avoid=20time=20out=20(#1627)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remove-deleted-polls/route.ts | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/apps/web/src/app/api/house-keeping/remove-deleted-polls/route.ts b/apps/web/src/app/api/house-keeping/remove-deleted-polls/route.ts index 26d44626a..6da11c6d6 100644 --- a/apps/web/src/app/api/house-keeping/remove-deleted-polls/route.ts +++ b/apps/web/src/app/api/house-keeping/remove-deleted-polls/route.ts @@ -3,6 +3,8 @@ import { NextResponse } from "next/server"; import { checkApiAuthorization } from "@/utils/api-auth"; +const BATCH_SIZE = 100; + /** * Remove polls and corresponding data that have been marked deleted for more than 7 days. */ @@ -11,20 +13,42 @@ export async function POST() { if (unauthorized) return unauthorized; // First get the ids of all the polls that have been marked as deleted for at least 7 days - const deletedPolls = await prisma.poll.deleteMany({ - where: { - deleted: true, - deletedAt: { - lt: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), + let totalDeletedPolls = 0; + let hasMore = true; + + const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); + + while (hasMore) { + const batch = await prisma.poll.findMany({ + where: { + deleted: true, + deletedAt: { + lt: sevenDaysAgo, + }, }, - }, - }); + select: { id: true }, + take: BATCH_SIZE, + }); + + if (batch.length === 0) { + hasMore = false; + break; + } + + const deleted = await prisma.poll.deleteMany({ + where: { + id: { in: batch.map((poll) => poll.id) }, + }, + }); + + totalDeletedPolls += deleted.count; + } return NextResponse.json({ success: true, summary: { deleted: { - polls: deletedPolls.count, + polls: totalDeletedPolls, }, }, });