QLVB / backend /scheduler.js
hoangthiencm's picture
Upload 14 files
ef54470 verified
// Scheduler - Tự động kiểm tra và gửi email nhắc nhở mỗi ngày
// Sử dụng node-cron để chạy scheduled tasks
const cron = require('node-cron');
const emailService = require('./email-service');
class Scheduler {
constructor() {
this.jobs = [];
this.isRunning = false;
}
/**
* Khởi động daily reminder job
* Chạy mỗi ngày lúc 8:00 AM
* @param {function} checkAndSendFunction - Hàm xử lý check và gửi email
*/
startDailyReminders(checkAndSendFunction) {
// Cron expression: '0 8 * * *' = Every day at 8:00 AM
const job = cron.schedule('0 8 * * *', async () => {
console.log('\n=== Running daily deadline check ===');
console.log(new Date().toLocaleString('vi-VN'));
try {
await checkAndSendFunction();
console.log('✓ Daily reminder check completed');
} catch (error) {
console.error('✗ Error in daily reminder:', error);
}
});
this.jobs.push(job);
this.isRunning = true;
console.log('✓ Daily reminder scheduler started (runs at 8:00 AM every day)');
}
/**
* Tạo job custom với cron expression
* @param {string} cronExpression - Cron expression
* @param {function} taskFunction - Hàm cần chạy
* @param {string} jobName - Tên job (optional)
*/
createCustomJob(cronExpression, taskFunction, jobName = 'Custom Job') {
const job = cron.schedule(cronExpression, async () => {
console.log(`\n=== Running ${jobName} ===`);
console.log(new Date().toLocaleString('vi-VN'));
try {
await taskFunction();
console.log(`✓ ${jobName} completed`);
} catch (error) {
console.error(`✗ Error in ${jobName}:`, error);
}
});
this.jobs.push(job);
console.log(`✓ ${jobName} scheduled: ${cronExpression}`);
return job;
}
/**
* Dừng tất cả scheduled jobs
*/
stopAll() {
this.jobs.forEach(job => job.stop());
this.jobs = [];
this.isRunning = false;
console.log('✓ All scheduled jobs stopped');
}
/**
* Trigger thủ công (cho testing)
* @param {function} checkAndSendFunction - Hàm xử lý check và gửi email
*/
async runNow(checkAndSendFunction) {
console.log('\n=== Manual trigger: Deadline check ===');
console.log(new Date().toLocaleString('vi-VN'));
try {
await checkAndSendFunction();
console.log('✓ Manual check completed');
} catch (error) {
console.error('✗ Error in manual check:', error);
throw error;
}
}
}
module.exports = new Scheduler();