42 lines
1.1 KiB
JavaScript
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);
|
|
}
|
|
});
|