import { prisma } from '@documenso/prisma'; import { DateTime } from 'luxon'; import type { JobRunIO } from '../../client/_internal/job'; import type { TCleanupRateLimitsJobDefinition } from './cleanup-rate-limits'; const BATCH_SIZE = 10_000; export const run = async ({ io }: { payload: TCleanupRateLimitsJobDefinition; io: JobRunIO }) => { const cutoff = DateTime.now().minus({ hours: 24 }).toJSDate(); let totalDeleted = 0; let deleted = 0; do { // Prisma doesn't support DELETE with LIMIT, so use raw SQL for batching // to avoid long-running transactions that could lock the table. deleted = await prisma.$executeRaw` DELETE FROM "RateLimit" WHERE ctid IN ( SELECT ctid FROM "RateLimit" WHERE "createdAt" < ${cutoff} LIMIT ${BATCH_SIZE} ) `; totalDeleted += deleted; } while (deleted >= BATCH_SIZE); if (totalDeleted > 0) { io.logger.info(`Cleaned up ${totalDeleted} expired rate limit entries`); } else { io.logger.info('No expired rate limit entries to clean up'); } };