/** * Copyright (c) 2026 Niolla * All rights reserved. * * This source code is proprietary and confidential. * Unauthorized copying, modification, distribution, or use * of this file, via any medium, is strictly prohibited. */ // cron/cleanInactiveNotifications.cron.js const cron = require("node-cron"); const { sequelize, notification, userNotification, } = require("../app/models"); function startCleanInactiveNotificationsCron() { console.log("Inactive Notification Cleanup Cron Started"); const task = cron.schedule( "0 0 * * *", // Run every day at midnight async () => { console.log( `[CRON] Cleaning inactive notifications... ${new Date().toISOString()}`, ); try { const inactiveNotifications = await notification.findAll({ where: { isActive: false, }, attributes: ["notification_id"], }); if (!inactiveNotifications.length) { console.log("[CRON] No inactive notifications found."); return; } const notificationIds = inactiveNotifications.map( (item) => item.notification_id, ); const transaction = await sequelize.transaction(); try { // Delete user-notification relationships first const deletedUserNotifications = await userNotification.destroy({ where: { notification_id: notificationIds, }, transaction, }); // Delete inactive notifications const deletedNotifications = await notification.destroy({ where: { notification_id: notificationIds, isActive: false, }, transaction, }); await transaction.commit(); console.log( `[CRON] Cleanup completed. Deleted ${deletedNotifications} notifications and ${deletedUserNotifications} user notification records.`, ); } catch (err) { await transaction.rollback(); console.error( "[CRON] Failed to clean inactive notifications:", err, ); } } catch (err) { console.error( "[CRON] Error while checking inactive notifications:", err, ); } }, { scheduled: false, }, ); task.start(); return task; } module.exports = startCleanInactiveNotificationsCron;