Initial commit: Club DynaSQY
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
const cron = require('node-cron');
|
||||
const webPush = require('web-push');
|
||||
const pool = require('../config/db');
|
||||
|
||||
const publicVapidKey = process.env.VAPID_PUBLIC_KEY;
|
||||
const privateVapidKey = process.env.VAPID_PRIVATE_KEY;
|
||||
|
||||
if (publicVapidKey && privateVapidKey) {
|
||||
webPush.setVapidDetails('mailto:pierre@secourit.fr', publicVapidKey, privateVapidKey);
|
||||
}
|
||||
|
||||
const REMINDER_MESSAGES = [
|
||||
{
|
||||
title: 'Dyna Biz Coignières',
|
||||
body: 'Pensez à mettre à jour vos invités et recommandations !',
|
||||
icon: '/logo.svg',
|
||||
badge: '/favicon.svg',
|
||||
},
|
||||
];
|
||||
|
||||
function getNextReminderDate(days) {
|
||||
const d = new Date();
|
||||
d.setDate(d.getDate() + days);
|
||||
d.setHours(9, 0, 0, 0);
|
||||
return d;
|
||||
}
|
||||
|
||||
async function sendReminders() {
|
||||
console.log('[Push Cron] Checking reminders...');
|
||||
try {
|
||||
const [subscriptions] = await pool.query(
|
||||
`SELECT ps.*, u.prenom, u.nom
|
||||
FROM push_subscriptions ps
|
||||
JOIN users u ON u.id = ps.user_id
|
||||
WHERE ps.last_sent_at IS NULL
|
||||
OR DATE_ADD(ps.last_sent_at, INTERVAL ps.reminder_days DAY) <= NOW()`
|
||||
);
|
||||
|
||||
console.log(`[Push Cron] Found ${subscriptions.length} subscription(s) to notify`);
|
||||
|
||||
for (const sub of subscriptions) {
|
||||
try {
|
||||
const msg = REMINDER_MESSAGES[0];
|
||||
const payload = JSON.stringify({
|
||||
title: msg.title,
|
||||
body: msg.body,
|
||||
icon: msg.icon,
|
||||
badge: msg.badge,
|
||||
data: { url: '/' },
|
||||
});
|
||||
|
||||
await webPush.sendNotification(
|
||||
{ endpoint: sub.endpoint, keys: { p256dh: sub.p256dh, auth: sub.auth } },
|
||||
payload
|
||||
);
|
||||
|
||||
await pool.query('UPDATE push_subscriptions SET last_sent_at = NOW() WHERE id = ?', [sub.id]);
|
||||
console.log(`[Push Cron] Sent to ${sub.prenom} ${sub.nom}`);
|
||||
} catch (err) {
|
||||
if (err.statusCode === 410 || err.statusCode === 404) {
|
||||
await pool.query('DELETE FROM push_subscriptions WHERE id = ?', [sub.id]);
|
||||
console.log(`[Push Cron] Removed expired subscription for ${sub.prenom} ${sub.nom}`);
|
||||
} else {
|
||||
console.error(`[Push Cron] Error sending to ${sub.prenom} ${sub.nom}:`, err.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('[Push Cron] Error:', err);
|
||||
}
|
||||
}
|
||||
|
||||
function startPushCron() {
|
||||
if (!publicVapidKey || !privateVapidKey) {
|
||||
console.log('[Push Cron] VAPID keys not configured — skipping cron start');
|
||||
return;
|
||||
}
|
||||
|
||||
cron.schedule('0 9 * * *', () => {
|
||||
sendReminders();
|
||||
});
|
||||
|
||||
console.log('[Push Cron] Scheduled daily at 09:00');
|
||||
}
|
||||
|
||||
module.exports = { startPushCron, sendReminders };
|
||||
Reference in New Issue
Block a user