mirror of
https://github.com/documenso/documenso.git
synced 2026-08-24 23:32:29 +10:00
37 lines
1.2 KiB
TypeScript
37 lines
1.2 KiB
TypeScript
import { prisma } from '@documenso/prisma';
|
|
|
|
import type { JobRunIO } from '../../client/_internal/job';
|
|
import type { TCleanupAnonymousTokensJobDefinition } from './cleanup-anonymous-tokens';
|
|
|
|
const BATCH_SIZE = 10_000;
|
|
|
|
export const run = async ({ io }: { payload: TCleanupAnonymousTokensJobDefinition; io: JobRunIO }) => {
|
|
// Snapshot the cutoff so the run is bounded by the rows that were already
|
|
// expired when it started, rather than chasing rows expiring mid-run.
|
|
const cutoff = new Date();
|
|
|
|
let totalDeleted = 0;
|
|
let deleted = 0;
|
|
|
|
do {
|
|
// Postgres doesn't support DELETE with LIMIT, so batch via ctid to avoid
|
|
// long-running transactions that could lock the table.
|
|
deleted = await prisma.$executeRaw`
|
|
DELETE FROM "AnonymousVerificationToken"
|
|
WHERE ctid IN (
|
|
SELECT ctid FROM "AnonymousVerificationToken"
|
|
WHERE "expiresAt" < ${cutoff}
|
|
LIMIT ${BATCH_SIZE}
|
|
)
|
|
`;
|
|
|
|
totalDeleted += deleted;
|
|
} while (deleted >= BATCH_SIZE);
|
|
|
|
if (totalDeleted > 0) {
|
|
io.logger.info(`Cleaned up ${totalDeleted} expired anonymous verification tokens`);
|
|
} else {
|
|
io.logger.info('No expired anonymous verification tokens to clean up');
|
|
}
|
|
};
|