Add Vercel Cron Jobs for daily reminders and DB cleanup #3710
2 changed files+39−0
Addedapi/cron/cleanup.js+35−0View fileUnifiedSplit
@@ -0,0 +1,35 @@
1// GET /api/cron/cleanup — Vercel Cron Job: daily cleanup of expired/stale data
2// Configured in vercel.json to run daily at 6:00 UTC (7 PM NZDT)
3
4const { getDb } = require("../lib/db");
5const { ok, unauthorized, serverError } = require("../lib/helpers");
6
7module.exports = async function handler(req, res) {
8 // Verify this is a legitimate cron call (Vercel sets this header)
9 const cronSecret = req.headers["authorization"];
10 const expectedSecret = process.env.CRON_SECRET;
11
12 // In production, verify the cron secret
13 if (expectedSecret && cronSecret !== `Bearer ${expectedSecret}`) {
14 return unauthorized(res, "Invalid cron secret");
15 }
16
17 const results = {};
18
19 try {
20 const sql = getDb();
21
22 // Delete expired password reset tokens (tokens expire after 1 hour, clean up after 2)
23 const cutoff = new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString();
24 const deleted = await sql`
25 DELETE FROM password_resets
26 WHERE expires_at < ${cutoff}
27 `;
28 results.expiredPasswordResets = deleted.count ?? 0;
29 console.log(`Cleanup: removed ${results.expiredPasswordResets} expired password reset token(s)`);
30
31 return ok(res, { message: "Cleanup complete", results });
32 } catch (err) {
33 return serverError(res, err.message);
34 }
35};
c comment · e edit title · m merge · a approve · r request changes · ? shortcuts