dev1/backend/jobs/reminderCron.js
Josh 5838f782e7
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
removed files from tracking, dependencies, fixed encryption
2025-08-19 12:24:54 +00:00

42 lines
1.1 KiB
JavaScript

// backend/jobs/reminderCron.js
import cron from 'node-cron';
import pool from '../config/mysqlPool.js';
import { sendSMS } from '../utils/smsService.js';
const BATCH_SIZE = 25;
/* Every minute */
cron.schedule('*/1 * * * *', async () => {
try {
// IMPORTANT: use execute() so the param is truly bound
const [rows] = await pool.execute(
`SELECT id,
phone_e164 AS toNumber,
message_body AS body
FROM reminders
WHERE status = 'pending'
AND send_at_utc <= UTC_TIMESTAMP()
ORDER BY send_at_utc ASC
LIMIT ?`,
[BATCH_SIZE] // must be a number
);
if (!rows.length) return;
let sent = 0, failed = 0;
for (const r of rows) {
try {
await sendSMS({ reminderId: r.id, to: r.toNumber, body: r.body });
sent++;
} catch (err) {
console.error('[reminderCron] Twilio error:', err?.message || err);
failed++;
}
}
console.log(`[reminderCron] processed ${rows.length}: ${sent} sent, ${failed} failed`);
} catch (err) {
console.error('[reminderCron] DB error:', err);
}
});