@devx-commerce/plugin-loyalty
Version:
A starter for Medusa plugins.
82 lines • 7.95 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.config = void 0;
exports.default = loyaltyMonthlyReportJob;
const utils_1 = require("@medusajs/framework/utils");
const core_flows_1 = require("@medusajs/medusa/core-flows");
const generate_monthly_report_1 = require("../workflows/points/generate-monthly-report");
async function loyaltyMonthlyReportJob(container) {
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
try {
// Check if today is the 1st of the month in IST
// Schedule runs daily to avoid Node.js setTimeout 32-bit overflow for monthly crons
const now = new Date();
const istDay = new Intl.DateTimeFormat("en-CA", { timeZone: "Asia/Kolkata", day: "2-digit" }).format(now);
if (istDay !== "01") {
return;
}
const formatter = new Intl.DateTimeFormat("en-CA", {
timeZone: "Asia/Kolkata",
year: "numeric",
month: "2-digit",
day: "2-digit",
});
const [year, month] = formatter.format(new Date()).split("-").map(Number);
const lastDayPrevMonth = new Date(year, month - 1, 0);
const end_date = formatter.format(lastDayPrevMonth);
const fileMonth = end_date.slice(0, 7);
const start_date = `${year}-01-01`;
const { result } = await (0, generate_monthly_report_1.generateMonthlyReportWorkflow)(container).run({
input: { start_date, end_date },
});
const fileName = `loyalty-reports/loyalty-points-report-${fileMonth}.csv`;
// Upload CSV to S3
const { result: uploadResult } = await (0, core_flows_1.uploadFilesWorkflow)(container).run({
input: {
files: [
{
filename: fileName,
mimeType: "text/csv",
content: result.csv,
access: "private",
},
],
},
});
const fileKey = uploadResult[0].id;
// Generate presigned download URL
const fileService = container.resolve(utils_1.Modules.FILE);
const s3ProviderService = fileService.getProvider();
const downloadUrl = await s3ProviderService.getPresignedDownloadUrl({
fileKey,
});
// Send email notification
const recipientEmails = process.env.LOYALTY_REPORT_EMAIL?.split(",").map(e => e.trim()).filter(Boolean);
if (!recipientEmails?.length) {
logger.error("[loyalty-monthly-report]: LOYALTY_REPORT_EMAIL env not set, skipping email");
}
else {
const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
await notificationService.createNotifications(recipientEmails.map((email) => ({
to: email,
channel: "email",
template: "Loyalty Monthly Report",
idempotency_key: `loyalty_monthly_report_${fileMonth}_${email}`,
data: { from: "admin" },
content: {
subject: `Loyalty Points Report`,
html: `Hi,<br><br>The loyalty points report for the period <strong>${start_date.split("-").reverse().join("/")} </strong> to <strong>${end_date.split("-").reverse().join("/")}</strong> has been generated and is ready for download.<br><br>Please note that the download link is valid for a limited time, so we recommend downloading the file at your earliest convenience.<br><br>You can download the report using the link below:<br><a href="${downloadUrl}">Report</a><br><br>Regards,<br>The Whole Truth`,
},
})));
}
}
catch (error) {
logger.error("[loyalty-monthly-report]: Failed to generate report", error);
throw error;
}
}
exports.config = {
name: "loyalty-monthly-report",
schedule: "0 3 * * *", // Daily at 3:00 AM UTC, job self-checks for 1st of month
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG95YWx0eS1tb250aGx5LXJlcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL2xveWFsdHktbW9udGhseS1yZXBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsMENBaUZDO0FBckZELHFEQUErRTtBQUMvRSw0REFBa0U7QUFDbEUseUZBQTRGO0FBRTdFLEtBQUssVUFBVSx1QkFBdUIsQ0FDbkQsU0FBMEI7SUFFMUIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVuRSxJQUFJLENBQUM7UUFDSCxnREFBZ0Q7UUFDaEQsb0ZBQW9GO1FBQ3BGLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFHLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3BCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtZQUNqRCxRQUFRLEVBQUUsY0FBYztZQUN4QixJQUFJLEVBQUUsU0FBUztZQUNmLEtBQUssRUFBRSxTQUFTO1lBQ2hCLEdBQUcsRUFBRSxTQUFTO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxJQUFJ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