81 lines
2.6 KiB
JavaScript
81 lines
2.6 KiB
JavaScript
import cron from 'node-cron';
|
|
import nodemailer from 'nodemailer';
|
|
|
|
const transporter = nodemailer.createTransport({
|
|
host: process.env.SMTP_HOST,
|
|
port: parseInt(process.env.SMTP_PORT || '587'),
|
|
secure: false,
|
|
auth: {
|
|
user: process.env.SMTP_USER,
|
|
pass: process.env.SMTP_PASS,
|
|
}
|
|
});
|
|
|
|
export async function sendReportEmail(start, end, subject = "TrACreport Summary") {
|
|
const url = new URL(process.env.WEBURL);
|
|
url.searchParams.set('start', start.toISOString().slice(0, 10));
|
|
url.searchParams.set('end', end.toISOString().slice(0, 10));
|
|
url.searchParams.set('password', process.env.PASSWORD);
|
|
|
|
const maxAttempts = 3;
|
|
const delay = (ms) => new Promise((res) => setTimeout(res, ms));
|
|
|
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
try {
|
|
console.log(`📡 Attempt ${attempt}: fetching ${url}`);
|
|
|
|
const res = await fetch(url.toString());
|
|
if (!res.ok) throw new Error(`Fetch failed: ${res.status} ${res.statusText}`);
|
|
|
|
const html = await res.text();
|
|
|
|
await transporter.sendMail({
|
|
from: `"TrACreport Bot" <${process.env.SMTP_USER}>`,
|
|
to: process.env.MAIL_RECIPIENTS,
|
|
subject,
|
|
html,
|
|
});
|
|
|
|
console.log(`✅ Report emailed: ${subject} (${start.toISOString().slice(0, 10)})`);
|
|
return; // Success, exit function
|
|
|
|
} catch (err) {
|
|
console.error(`❌ Attempt ${attempt} failed:`, err);
|
|
|
|
if (attempt < maxAttempts) {
|
|
console.log(`⏳ Retrying in 5s...`);
|
|
await delay(5000); // Wait before retry
|
|
} else {
|
|
console.error(`🚫 All ${maxAttempts} attempts failed. Giving up.`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Daily Report
|
|
cron.schedule('5 1 * * *', () => {
|
|
const today = new Date();
|
|
const yesterday = new Date(today);
|
|
yesterday.setUTCDate(today.getUTCDate() - 1);
|
|
sendReportEmail(yesterday, yesterday, "❄️ TrACreport Daily Report");
|
|
});
|
|
|
|
// Weekly Report
|
|
cron.schedule('10 1 * * 1', () => {
|
|
const today = new Date();
|
|
const end = new Date(today);
|
|
end.setUTCDate(today.getUTCDate() - 1);
|
|
const start = new Date(end);
|
|
start.setUTCDate(end.getUTCDate() - 6);
|
|
sendReportEmail(start, end, "🛤️ TrACreport Weekly Report");
|
|
})
|
|
|
|
// Monthly Report
|
|
cron.schedule('15 1 1 * *', () => {
|
|
const today = new Date();
|
|
const end = new Date(Date.UTC(today.getUTCFullYear(), today.getUTCMonth(), 0)); // Last day of previous month
|
|
const start = new Date(Date.UTC(end.getUTCFullYear(), end.getUTCMonth(), 1)); // First day of previous month
|
|
sendReportEmail(start, end, "🚂 TrACreport Monthly Report");
|
|
});
|
|
|
|
console.log('📅 TrACreport schedulers are active'); |