From f2c57c513e297db1371e57f02696f047633ddaf3 Mon Sep 17 00:00:00 2001 From: Matt Ciaccio Date: Mon, 27 Apr 2026 21:58:14 +0200 Subject: [PATCH] feat(queue): implement form-expiry-check maintenance job Marks pending form_submissions whose expires_at has passed as 'expired'. Logs the count of rows transitioned each run. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/lib/queue/workers/maintenance.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/lib/queue/workers/maintenance.ts b/src/lib/queue/workers/maintenance.ts index 6348cdd..b982433 100644 --- a/src/lib/queue/workers/maintenance.ts +++ b/src/lib/queue/workers/maintenance.ts @@ -1,6 +1,9 @@ import { Worker, type Job } from 'bullmq'; +import { and, eq, lt } from 'drizzle-orm'; import type { ConnectionOptions } from 'bullmq'; +import { db } from '@/lib/db'; +import { formSubmissions } from '@/lib/db/schema/documents'; import { logger } from '@/lib/logger'; import { QUEUE_CONFIGS } from '@/lib/queue'; @@ -15,8 +18,14 @@ export const maintenanceWorker = new Worker( break; } case 'form-expiry-check': { - // TODO(L3): mark expired form submissions - logger.info('Form expiry check — not yet implemented'); + const result = await db + .update(formSubmissions) + .set({ status: 'expired' }) + .where( + and(eq(formSubmissions.status, 'pending'), lt(formSubmissions.expiresAt, new Date())), + ) + .returning({ id: formSubmissions.id }); + logger.info({ expired: result.length }, 'Form expiry check complete'); break; } default: