// 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); } });