102 lines
2.4 KiB
JavaScript
102 lines
2.4 KiB
JavaScript
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;
|