const cron = require("node-cron"); const { Rental } = require("../models"); const { Op } = require("sequelize"); const logger = require("../utils/logger"); const statusUpdateSchedule = "*/15 * * * *"; // Run every 15 minutes class RentalStatusJob { static startScheduledStatusUpdates() { console.log("Starting automated rental status updates..."); const statusJob = cron.schedule( statusUpdateSchedule, async () => { try { await this.activateStartedRentals(); } catch (error) { logger.error("Error in scheduled rental status update", { error: error.message, stack: error.stack }); } }, { scheduled: false, timezone: "America/New_York", } ); // Start the job statusJob.start(); console.log("Rental status job scheduled:"); console.log("- Status updates every 15 minutes: " + statusUpdateSchedule); return { statusJob, stop() { statusJob.stop(); console.log("Rental status job stopped"); }, getStatus() { return { statusJobRunning: statusJob.getStatus() === "scheduled", }; }, }; } static async activateStartedRentals() { try { const now = new Date(); // Find all confirmed rentals where start time has arrived const rentalsToActivate = await Rental.findAll({ where: { status: "confirmed", startDateTime: { [Op.lte]: now, }, }, }); if (rentalsToActivate.length === 0) { return { activated: 0 }; } // Update all matching rentals to active status const rentalIds = rentalsToActivate.map((r) => r.id); const [updateCount] = await Rental.update( { status: "active" }, { where: { id: { [Op.in]: rentalIds, }, }, } ); logger.info("Activated started rentals", { count: updateCount, rentalIds: rentalIds, }); console.log(`Activated ${updateCount} rentals that have started`); return { activated: updateCount, rentalIds }; } catch (error) { logger.error("Error activating started rentals", { error: error.message, stack: error.stack, }); throw error; } } } module.exports = RentalStatusJob;