@kb0912/notification-brevo 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ async function GET(req, res) {
5
+ res.sendStatus(200);
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGtCQUtDO0FBTE0sS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixDQUFDIn0=
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ async function GET(req, res) {
5
+ res.sendStatus(200);
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BsdWdpbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGtCQUtDO0FBTE0sS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixDQUFDIn0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = checkAbandonedCartsJob;
5
+ const check_abandoned_carts_1 = require("../workflows/steps/check-abandoned-carts");
6
+ async function checkAbandonedCartsJob(container) {
7
+ const logger = container.resolve("logger");
8
+ console.log("Registered services:", container.registrations); // Debug container
9
+ const myNotificationProvider = container.resolve("brevo");
10
+ const providerOptions = myNotificationProvider.options; // Lấy options từ BrevoProviderService
11
+ try {
12
+ logger.info("Running check-abandoned-carts scheduled job...");
13
+ await (0, check_abandoned_carts_1.checkAbandonedCartsWorkflow)(container).run({
14
+ input: {
15
+ container, // Truyền container
16
+ options: providerOptions.abandoned_cart, // Truyền abandoned_cart options
17
+ },
18
+ });
19
+ }
20
+ catch (error) {
21
+ logger.error("Error in check-abandoned-carts scheduled job:", error);
22
+ }
23
+ }
24
+ exports.config = {
25
+ name: "check-abandoned-carts",
26
+ schedule: "* * * * *", // Chạy mỗi giờ
27
+ };
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJhbmRvbmVkLWNhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9hYmFuZG9uZWQtY2FydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSx5Q0FpQkc7QUFwQkgsb0ZBQXVGO0FBR3hFLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxTQUEwQjtJQUMzRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsa0JBQWtCO0lBQ2hGLE1BQU0sc0JBQXNCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBdUIsT0FBTyxDQUFDLENBQUM7SUFDaEYsTUFBTSxlQUFlLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUMsc0NBQXNDO0lBRTlGLElBQUksQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUM5RCxNQUFNLElBQUEsbURBQTJCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQy9DLEtBQUssRUFBRTtnQkFDTCxTQUFTLEVBQUUsbUJBQW1CO2dCQUM5QixPQUFPLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxnQ0FBZ0M7YUFDMUU7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0NBQStDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsdUJBQXVCO0lBQzdCLFFBQVEsRUFBRSxXQUFXLEVBQUUsZUFBZTtDQUN2QyxDQUFDIn0=
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = abandonedCartLoader;
4
+ async function abandonedCartLoader({ container, options, }) {
5
+ const logger = container.resolve("logger");
6
+ logger.info("Initializing abandoned cart loader...");
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJhbmRvbmVkLWNhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbG9hZGVycy9hYmFuZG9uZWQtY2FydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVdBLHNDQVNDO0FBVGMsS0FBSyxVQUFVLG1CQUFtQixDQUFDLEVBQzlDLFNBQVMsRUFDVCxPQUFPLEdBQ087SUFDaEIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUzQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7QUFHdkQsQ0FBQyJ9
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BREVO_MODULE = void 0;
7
+ const services_1 = __importDefault(require("./services"));
8
+ const utils_1 = require("@medusajs/framework/utils");
9
+ exports.BREVO_MODULE = "brevo";
10
+ exports.default = (0, utils_1.ModuleProvider)(exports.BREVO_MODULE, {
11
+ services: [services_1.default],
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL25vdGlmaWNhdGlvbnMtYnJldm8vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsMERBQTZDO0FBQzdDLHFEQUdrQztBQUNyQixRQUFBLFlBQVksR0FBRyxPQUFPLENBQUE7QUFFbkMsa0JBQWUsSUFBQSxzQkFBYyxFQUFDLG9CQUFZLEVBQUU7SUFDMUMsUUFBUSxFQUFFLENBQUMsa0JBQW9CLENBQUM7Q0FDakMsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const utils_1 = require("@medusajs/framework/utils");
37
+ const Brevo = __importStar(require("@getbrevo/brevo"));
38
+ class BrevoProviderService extends utils_1.AbstractNotificationProviderService {
39
+ constructor({ logger }, options) {
40
+ super();
41
+ this.options = options;
42
+ this.logger = logger;
43
+ console.log("BrevoProviderService initialized with options:", options);
44
+ if (!this.options.apiKey) {
45
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "BREVO_API_KEY phải được cấu hình trong options");
46
+ }
47
+ if (!this.options.from) {
48
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "BREVO_FROM_EMAIL phải được cấu hình trong options");
49
+ }
50
+ this.apiInstance = new Brevo.TransactionalEmailsApi();
51
+ this.apiInstance.setApiKey(Brevo.TransactionalEmailsApiApiKeys.apiKey, this.options.apiKey);
52
+ }
53
+ async send(notification) {
54
+ const { to, template, data } = notification;
55
+ let templateId;
56
+ let params;
57
+ switch (template) {
58
+ case "order.placed":
59
+ templateId = parseInt(this.options.orderPlacedTemplateId);
60
+ params = {
61
+ order_id: data.order?.id,
62
+ email: data.order?.email,
63
+ currency_code: data.order?.currency_code,
64
+ display_id: data.order?.display_id,
65
+ total: data.order?.total / 100, // Định dạng total
66
+ customer_name: data.order?.billing_address?.first_name || "Khách hàng",
67
+ items: data.order?.items, // Danh sách sản phẩm
68
+ shipping_address: data.order?.shipping_address, // Địa chỉ giao hàng
69
+ payment_collections: data.order?.payment_collections, // Thông tin thanh toán
70
+ shipping_methods: data.order?.shipping_methods, // Thông tin thanh toán
71
+ fulfillments: data.order?.fulfillments, // Thông tin vận chuyển
72
+ };
73
+ this.logger.info(JSON.stringify(params, null, 2));
74
+ break;
75
+ case "order.canceled":
76
+ templateId = parseInt(this.options.orderCanceledTemplateId);
77
+ params = {
78
+ order_id: data.order?.id,
79
+ customer_name: data.order?.billing_address?.first_name || "Khách hàng",
80
+ };
81
+ break;
82
+ case "customer.created":
83
+ templateId = parseInt(this.options.customerCreatedTemplateId);
84
+ params = {
85
+ name: data.customer?.first_name + " " + (data.customer?.last_name || ""),
86
+ phone: data.customer?.phone || "Không có số điện thoại",
87
+ customer_id: data.customer?.id,
88
+ };
89
+ break;
90
+ case "cart.abandoned":
91
+ templateId = parseInt(this.options.abandonedCartTemplateId);
92
+ params = {
93
+ cart_id: data.cart?.id,
94
+ created_at: data.cart?.created_at,
95
+ name: data.cart?.name || "Khách hàng",
96
+ phone: data.cart?.phone || "Không có số điện thoại",
97
+ };
98
+ break;
99
+ default:
100
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Template ${template} không được hỗ trợ`);
101
+ }
102
+ if (isNaN(templateId) || templateId === 0) {
103
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Template ID cho ${template} không được cấu hình hợp lệ trong options`);
104
+ }
105
+ if (!to) {
106
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Không tìm thấy địa chỉ email để gửi cho template ${template}`);
107
+ }
108
+ const sendSmtpEmail = new Brevo.SendSmtpEmail();
109
+ sendSmtpEmail.sender = { email: this.options.from };
110
+ sendSmtpEmail.to = [{ email: to }];
111
+ sendSmtpEmail.templateId = templateId;
112
+ sendSmtpEmail.params = params;
113
+ try {
114
+ const response = await this.apiInstance.sendTransacEmail(sendSmtpEmail);
115
+ this.logger.info(`Email sent to ${to} for template ${template}`);
116
+ return {
117
+ id: `${template}-${Date.now()}`,
118
+ };
119
+ }
120
+ catch (error) {
121
+ this.logger.error(`Lỗi khi gửi email qua Brevo cho ${to}:`, error);
122
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Không thể gửi email qua Brevo");
123
+ }
124
+ }
125
+ async resend(notification) {
126
+ return this.send(notification);
127
+ }
128
+ }
129
+ BrevoProviderService.identifier = "brevo";
130
+ exports.default = BrevoProviderService;
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL25vdGlmaWNhdGlvbnMtYnJldm8vc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFHbUM7QUFNbkMsdURBQXlDO0FBdUJ6QyxNQUFNLG9CQUFxQixTQUFRLDJDQUFtQztJQU9wRSxZQUFZLEVBQUUsTUFBTSxFQUFzQixFQUFFLE9BQTRCO1FBQ3RFLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV2RSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixnREFBZ0QsQ0FDakQsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixtREFBbUQsQ0FDcEQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQ3hCLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLEVBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQ1IsWUFB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
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = customerCreatedHandler;
5
+ const send_customer_created_1 = require("../workflows/send-customer-created");
6
+ async function customerCreatedHandler({ event, container, }) {
7
+ // In dữ liệu đầu vào từ sự kiện
8
+ //console.log("customer.created subscriber triggered with event:", JSON.stringify(event, null, 2));
9
+ //console.log("Data received:", event.data);
10
+ try {
11
+ // Gọi workflow và in thông tin trước khi chạy
12
+ console.log("Running sendCustomerCreatedWorkflow with input:", { id: event.data.id });
13
+ const result = await (0, send_customer_created_1.sendCustomerCreatedWorkflow)(container).run({
14
+ input: { id: event.data.id },
15
+ });
16
+ console.log("Workflow result:", result);
17
+ }
18
+ catch (error) {
19
+ // In lỗi chi tiết nếu có
20
+ console.error("Error in customer.created subscriber:", error);
21
+ throw error; // Ném lại lỗi để Medusa ghi log
22
+ }
23
+ }
24
+ exports.config = {
25
+ event: "customer.created",
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXItY3JlYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9jdXN0b21lci1jcmVhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHlDQW9CQztBQXRCRCw4RUFBaUY7QUFFbEUsS0FBSyxVQUFVLHNCQUFzQixDQUFDLEVBQ25ELEtBQUssRUFDTCxTQUFTLEdBQ3NCO0lBQy9CLGdDQUFnQztJQUNoQyxtR0FBbUc7SUFDbkcsNENBQTRDO0lBRTVDLElBQUksQ0FBQztRQUNILDhDQUE4QztRQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsbURBQTJCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzlELEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtTQUM3QixDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YseUJBQXlCO1FBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUQsTUFBTSxLQUFLLENBQUMsQ0FBQyxnQ0FBZ0M7SUFDL0MsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLGtCQUFrQjtDQUMxQixDQUFDIn0=
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = orderCanceledHandler;
5
+ const send_order_canceled_1 = require("../workflows/send-order-canceled");
6
+ async function orderCanceledHandler({ event: { data }, container, }) {
7
+ await (0, send_order_canceled_1.sendOrderCanceledWorkflow)(container).run({
8
+ input: { id: data.id },
9
+ });
10
+ }
11
+ exports.config = {
12
+ event: "order.canceled",
13
+ };
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItY2FuY2VsZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvb3JkZXItY2FuY2VsZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsdUNBT0M7QUFURCwwRUFBNkU7QUFFOUQsS0FBSyxVQUFVLG9CQUFvQixDQUFDLEVBQ2pELEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxFQUNmLFNBQVMsR0FDc0I7SUFDL0IsTUFBTSxJQUFBLCtDQUF5QixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUM3QyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUN2QixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSxnQkFBZ0I7Q0FDeEIsQ0FBQyJ9
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = orderPlacedHandler;
5
+ const send_order_confirmation_1 = require("../workflows/send-order-confirmation");
6
+ async function orderPlacedHandler({ event: { data }, container, }) {
7
+ await (0, send_order_confirmation_1.sendOrderConfirmationWorkflow)(container)
8
+ .run({
9
+ input: {
10
+ id: data.id
11
+ }
12
+ });
13
+ }
14
+ exports.config = {
15
+ event: "order.placed",
16
+ };
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcGxhY2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLXBsYWNlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNRSxxQ0FVQztBQVpELGtGQUFvRjtBQUVyRSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsRUFDL0MsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUNzQjtJQUMvQixNQUFNLElBQUEsdURBQTZCLEVBQUMsU0FBUyxDQUFDO1NBQzNDLEdBQUcsQ0FBQztRQUNILEtBQUssRUFBRTtZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtTQUNaO0tBQ0YsQ0FBQyxDQUFBO0FBQ04sQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsY0FBYztDQUN0QixDQUFBIn0=
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendAbandonedCartWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const send_notification_1 = require("./steps/send-notification");
7
+ exports.sendAbandonedCartWorkflow = (0, workflows_sdk_1.createWorkflow)("send-abandoned-cart", ({ cartId }) => {
8
+ const cartStep = (0, core_flows_1.useQueryGraphStep)({
9
+ entity: "cart",
10
+ fields: [
11
+ "id",
12
+ "email",
13
+ "created_at",
14
+ "customer.first_name",
15
+ "customer.last_name",
16
+ "customer.phone",
17
+ "items.*"
18
+ ],
19
+ filters: { id: cartId },
20
+ });
21
+ const prepareNotificationStep = (0, workflows_sdk_1.createStep)("prepare-abandoned-cart-notification", async (input) => {
22
+ const carts = input.data;
23
+ console.log("Cart data retrieved:", carts);
24
+ const notificationData = [
25
+ {
26
+ to: carts[0].email,
27
+ channel: "email",
28
+ template: "cart.abandoned",
29
+ data: {
30
+ cart: {
31
+ id: carts[0].id,
32
+ created_at: carts[0].created_at,
33
+ name: (carts[0].customer?.first_name || "") + " " + (carts[0].customer?.last_name || ""),
34
+ phone: carts[0].customer?.phone || "Không có số điện thoại",
35
+ items: carts[0].items // Thêm danh sách items vào data.cart
36
+ },
37
+ },
38
+ },
39
+ ];
40
+ console.log("Prepared abandoned cart notification data:", notificationData);
41
+ return new workflows_sdk_1.StepResponse(notificationData);
42
+ });
43
+ const notificationData = prepareNotificationStep(cartStep);
44
+ const notificationStep = (0, send_notification_1.sendNotificationStep)(notificationData);
45
+ return new workflows_sdk_1.WorkflowResponse(notificationStep);
46
+ });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1hYmFuZG9uZWQtY2FydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc2VuZC1hYmFuZG9uZWQtY2FydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBK0c7QUFDL0csNERBQWdFO0FBQ2hFLGlFQUFpRTtBQU9wRCxRQUFBLHlCQUF5QixHQUFHLElBQUEsOEJBQWMsRUFDckQscUJBQXFCLEVBQ3JCLENBQUMsRUFBRSxNQUFNLEVBQWlCLEVBQUUsRUFBRTtJQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFBLDhCQUFpQixFQUFDO1FBQ2pDLE1BQU0sRUFBRSxNQUFNO1FBQ2QsTUFBTSxFQUFFO1lBQ04sSUFBSTtZQUNKLE9BQU87WUFDUCxZQUFZO1lBQ1oscUJBQXFCO1lBQ3JCLG9CQUFvQjtZQUNwQixnQkFBZ0I7WUFDaEIsU0FBUztTQUNWO1FBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRTtLQUN4QixDQUFDLENBQUM7SUFFSCxNQUFNLHVCQUF1QixHQUFHLElBQUEsMEJBQVUsRUFDeEMscUNBQXFDLEVBQ3JDLEtBQUssRUFBRSxLQUFzQixFQUFFLEVBQUU7UUFDL0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTNDLE1BQU0sZ0JBQWdCLEdBQTRCO1lBQ2hEO2dCQUNFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztnQkFDbEIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLElBQUksRUFBRTtvQkFDSixJQUFJLEVBQUU7d0JBQ0osRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNmLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVTt3QkFDL0IsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO3dCQUN4RixLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksd0JBQXdCO3dCQUMzRCxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUM7cUJBQzVEO2lCQUNGO2FBQ0Y7U0FDRixDQUFDO1FBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0Q0FBNEMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sSUFBSSw0QkFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUNGLENBQUM7SUFFRixNQUFNLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSx3Q0FBb0IsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRWhFLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2hELENBQUMsQ0FDRixDQUFDIn0=
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendCustomerCreatedWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const send_notification_1 = require("./steps/send-notification");
7
+ exports.sendCustomerCreatedWorkflow = (0, workflows_sdk_1.createWorkflow)("send-customer-created", ({ id }) => {
8
+ const { data: customers } = (0, core_flows_1.useQueryGraphStep)({
9
+ entity: "customer",
10
+ fields: ["*", "first_name", "last_name", "phone"],
11
+ filters: { id },
12
+ });
13
+ //console.log("Customer data retrieved:", customers);
14
+ const notification = (0, send_notification_1.sendNotificationStep)([
15
+ {
16
+ to: customers[0].email,
17
+ channel: "email",
18
+ template: "customer.created",
19
+ data: { customer: customers[0] },
20
+ },
21
+ ]);
22
+ return new workflows_sdk_1.WorkflowResponse(notification);
23
+ });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1jdXN0b21lci1jcmVhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zZW5kLWN1c3RvbWVyLWNyZWF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQXFGO0FBQ3JGLDREQUFnRTtBQUNoRSxpRUFBaUU7QUFNcEQsUUFBQSwyQkFBMkIsR0FBRyxJQUFBLDhCQUFjLEVBQ3ZELHVCQUF1QixFQUN2QixDQUFDLEVBQUUsRUFBRSxFQUFpQixFQUFFLEVBQUU7SUFDeEIsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFBLDhCQUFpQixFQUFDO1FBQzVDLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQztRQUNqRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUU7S0FDaEIsQ0FBQyxDQUFDO0lBRUgscURBQXFEO0lBRXJELE1BQU0sWUFBWSxHQUFHLElBQUEsd0NBQW9CLEVBQUM7UUFDeEM7WUFDRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDdEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ2pDO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLGdDQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzVDLENBQUMsQ0FDRixDQUFDIn0=
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendOrderCanceledWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const send_notification_1 = require("./steps/send-notification");
7
+ exports.sendOrderCanceledWorkflow = (0, workflows_sdk_1.createWorkflow)("send-order-canceled", ({ id }) => {
8
+ const { data: orders } = (0, core_flows_1.useQueryGraphStep)({
9
+ entity: "order",
10
+ fields: ["id", "email"],
11
+ filters: { id },
12
+ });
13
+ const notification = (0, send_notification_1.sendNotificationStep)([
14
+ {
15
+ to: orders[0].email,
16
+ channel: "email",
17
+ template: "order.canceled",
18
+ data: { order: orders[0] },
19
+ },
20
+ ]);
21
+ return new workflows_sdk_1.WorkflowResponse(notification);
22
+ });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1vcmRlci1jYW5jZWxlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc2VuZC1vcmRlci1jYW5jZWxlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBcUY7QUFDckYsNERBQWdFO0FBQ2hFLGlFQUFpRTtBQU1wRCxRQUFBLHlCQUF5QixHQUFHLElBQUEsOEJBQWMsRUFDckQscUJBQXFCLEVBQ3JCLENBQUMsRUFBRSxFQUFFLEVBQWlCLEVBQUUsRUFBRTtJQUN4QixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUEsOEJBQWlCLEVBQUM7UUFDekMsTUFBTSxFQUFFLE9BQU87UUFDZixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRTtLQUNoQixDQUFDLENBQUM7SUFFSCxNQUFNLFlBQVksR0FBRyxJQUFBLHdDQUFvQixFQUFDO1FBQ3hDO1lBQ0UsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQ25CLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUMzQjtLQUNGLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQ0YsQ0FBQyJ9
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendOrderConfirmationWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const send_notification_1 = require("./steps/send-notification");
7
+ exports.sendOrderConfirmationWorkflow = (0, workflows_sdk_1.createWorkflow)("send-order-confirmation", ({ id }) => {
8
+ // Bước 1: Lấy dữ liệu đơn hàng
9
+ const orderStep = (0, core_flows_1.useQueryGraphStep)({
10
+ entity: "order",
11
+ fields: [
12
+ "id",
13
+ "email",
14
+ "currency_code",
15
+ "display_id",
16
+ "total",
17
+ "items.*",
18
+ "billing_address.*",
19
+ "shipping_address.*",
20
+ "payment_collections.*",
21
+ "fulfillments.*",
22
+ "shipping_subtotal"
23
+ ],
24
+ filters: { id },
25
+ });
26
+ // Bước 2: Log dữ liệu thực tế của orders
27
+ const logOrderDataStep = (0, workflows_sdk_1.createStep)("log-order-data", async (input, { container }) => {
28
+ const orders = input.data;
29
+ const logger = container.resolve("logger");
30
+ return new workflows_sdk_1.StepResponse(orders);
31
+ });
32
+ // Bước 3: Chuẩn bị notificationData với định dạng tiền tệ
33
+ const prepareNotificationStep = (0, workflows_sdk_1.createStep)("prepare-order-confirmation-notification", async (input, { container }) => {
34
+ const orders = input;
35
+ const logger = container.resolve("logger");
36
+ const order = orders[0];
37
+ // Tạo formatter dựa trên currency_code của đơn hàng
38
+ const formatter = new Intl.NumberFormat([], {
39
+ style: "currency",
40
+ currencyDisplay: "narrowSymbol",
41
+ currency: order.currency_code.toUpperCase(), // "VND"
42
+ });
43
+ // Dùng payment_collections.amount thay vì total
44
+ const formattedShippingTotal = formatter.format(order.shipping_subtotal);
45
+ const formattedTotal = formatter.format(order.total);
46
+ // Định dạng unit_price cho từng item (giả sử dữ liệu gốc cần điều chỉnh)
47
+ const formattedItems = order.items.map((item) => ({
48
+ ...item, // Giữ nguyên các trường khác
49
+ unit_price: formatter.format(item.unit_price), // Dùng giá trị từ log
50
+ }));
51
+ const notificationData = [
52
+ {
53
+ to: order.email,
54
+ channel: "email",
55
+ template: "order.placed",
56
+ data: {
57
+ order: {
58
+ id: order.id,
59
+ email: order.email,
60
+ currency_code: order.currency_code,
61
+ display_id: order.display_id,
62
+ total: formattedTotal,
63
+ shipping_total: formattedShippingTotal,
64
+ items: formattedItems,
65
+ billing_address: order.billing_address,
66
+ shipping_address: order.shipping_address,
67
+ payment_collections: order.payment_collections,
68
+ fulfillments: order.fulfillments,
69
+ },
70
+ },
71
+ },
72
+ ];
73
+ console.log("Prepared order confirmed notification data:", JSON.stringify(notificationData, null, 2));
74
+ return new workflows_sdk_1.StepResponse(notificationData);
75
+ });
76
+ // Liên kết các bước
77
+ const resolvedOrders = logOrderDataStep(orderStep);
78
+ const notificationData = prepareNotificationStep(resolvedOrders);
79
+ const notification = (0, send_notification_1.sendNotificationStep)(notificationData);
80
+ return new workflows_sdk_1.WorkflowResponse(notification);
81
+ });
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1vcmRlci1jb25maXJtYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3NlbmQtb3JkZXItY29uZmlybWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUErRztBQUMvRyw0REFBZ0U7QUFDaEUsaUVBQWlFO0FBT3BELFFBQUEsNkJBQTZCLEdBQUcsSUFBQSw4QkFBYyxFQUN6RCx5QkFBeUIsRUFDekIsQ0FBQyxFQUFFLEVBQUUsRUFBaUIsRUFBRSxFQUFFO0lBQ3hCLCtCQUErQjtJQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFBLDhCQUFpQixFQUFDO1FBQ2xDLE1BQU0sRUFBRSxPQUFPO1FBQ2YsTUFBTSxFQUFFO1lBQ04sSUFBSTtZQUNKLE9BQU87WUFDUCxlQUFlO1lBQ2YsWUFBWTtZQUNaLE9BQU87WUFDUCxTQUFTO1lBQ1QsbUJBQW1CO1lBQ25CLG9CQUFvQjtZQUNwQix1QkFBdUI7WUFDdkIsZ0JBQWdCO1lBQ2hCLG1CQUFtQjtTQUNwQjtRQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRTtLQUNoQixDQUFDLENBQUM7SUFFSCx5Q0FBeUM7SUFDekMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDBCQUFVLEVBQ2pDLGdCQUFnQixFQUNoQixLQUFLLEVBQUUsS0FBc0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7UUFDOUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTNDLE9BQU8sSUFBSSw0QkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FDRixDQUFDO0lBRUYsMERBQTBEO0lBQzFELE1BQU0sdUJBQXVCLEdBQUcsSUFBQSwwQkFBVSxFQUN4Qyx5Q0FBeUMsRUFDekMsS0FBSyxFQUFFLEtBQVksRUFBRSxF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
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkAbandonedCartsWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const send_abandoned_cart_1 = require("../send-abandoned-cart");
7
+ exports.checkAbandonedCartsWorkflow = (0, workflows_sdk_1.createWorkflow)("check-abandoned-carts", ({ container, options }) => {
8
+ const checkCartsStep = (0, workflows_sdk_1.createStep)("check-abandoned-carts-step", async (_, { container: stepContainer }) => {
9
+ const cartModuleService = stepContainer.resolve(utils_1.Modules.CART);
10
+ const logger = stepContainer.resolve("logger");
11
+ const query = stepContainer.resolve("query");
12
+ const now = new Date();
13
+ const seventyTwoHoursAgo = new Date(now.getTime() - 72 * 60 * 60 * 1000);
14
+ // Sử dụng options từ input thay vì hardcode
15
+ const firstCheck = new Date(now.getTime() - parseInt(options.first.delay) * 60 * 60 * 1000);
16
+ const secondCheck = new Date(now.getTime() - parseInt(options.second.delay) * 60 * 60 * 1000);
17
+ const thirdCheck = new Date(now.getTime() - parseInt(options.third.delay) * 60 * 60 * 1000);
18
+ logger.info("Starting to check abandoned carts...");
19
+ logger.info(`Checking intervals: first=${options.first.delay}, second=${options.second.delay}, third=${options.third.delay}`);
20
+ const { data: carts } = await query.graph({
21
+ entity: "cart",
22
+ fields: ["id", "email", "created_at", "updated_at", "completed_at", "metadata"],
23
+ filters: {
24
+ completed_at: null,
25
+ email: { $ne: null },
26
+ updated_at: { $gte: seventyTwoHoursAgo.toISOString() },
27
+ },
28
+ });
29
+ logger.info(`Found ${carts.length} carts to check`);
30
+ for (const cart of carts) {
31
+ const updatedAt = new Date(cart.updated_at);
32
+ const hoursSinceUpdate = Math.floor((now.getTime() - updatedAt.getTime()) / (1000 * 60 * 60));
33
+ const notifiedFlags = {
34
+ first_abandonedcart_mail: cart.metadata?.first_abandonedcart_mail || false,
35
+ second_abandonedcart_mail: cart.metadata?.second_abandonedcart_mail || false,
36
+ third_abandonedcart_mail: cart.metadata?.third_abandonedcart_mail || false,
37
+ };
38
+ if (updatedAt <= firstCheck && !notifiedFlags.first_abandonedcart_mail) {
39
+ logger.info(`Sending first abandoned cart email to ${cart.email} after ${options.first.delay} hours`);
40
+ await (0, send_abandoned_cart_1.sendAbandonedCartWorkflow)(stepContainer).run({ input: { cartId: cart.id } });
41
+ await cartModuleService.updateCarts(cart.id, {
42
+ metadata: { ...cart.metadata, first_abandonedcart_mail: true },
43
+ });
44
+ }
45
+ else if (updatedAt <= secondCheck && !notifiedFlags.second_abandonedcart_mail) {
46
+ logger.info(`Sending second abandoned cart email to ${cart.email} after ${options.second.delay} hours`);
47
+ await (0, send_abandoned_cart_1.sendAbandonedCartWorkflow)(stepContainer).run({ input: { cartId: cart.id } });
48
+ await cartModuleService.updateCarts(cart.id, {
49
+ metadata: { ...cart.metadata, second_abandonedcart_mail: true },
50
+ });
51
+ }
52
+ else if (updatedAt <= thirdCheck && !notifiedFlags.third_abandonedcart_mail) {
53
+ logger.info(`Sending third abandoned cart email to ${cart.email} after ${options.third.delay} hours`);
54
+ await (0, send_abandoned_cart_1.sendAbandonedCartWorkflow)(stepContainer).run({ input: { cartId: cart.id } });
55
+ await cartModuleService.updateCarts(cart.id, {
56
+ metadata: { ...cart.metadata, third_abandonedcart_mail: true },
57
+ });
58
+ }
59
+ }
60
+ logger.info("Finished checking abandoned carts");
61
+ return new workflows_sdk_1.StepResponse(null);
62
+ });
63
+ const result = checkCartsStep();
64
+ return new workflows_sdk_1.WorkflowResponse(result);
65
+ });
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2stYWJhbmRvbmVkLWNhcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9jaGVjay1hYmFuZG9uZWQtY2FydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQStHO0FBQy9HLHFEQUFvRDtBQUNwRCxnRUFBbUU7QUFXdEQsUUFBQSwyQkFBMkIsR0FBRyxJQUFBLDhCQUFjLEVBQ3ZELHVCQUF1QixFQUN2QixDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBaUIsRUFBRSxFQUFFO0lBQ3hDLE1BQU0sY0FBYyxHQUFHLElBQUEsMEJBQVUsRUFDL0IsNEJBQTRCLEVBQzVCLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRTtRQUN4QyxNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRXpFLDRDQUE0QztRQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM1RixNQUFNLFdBQVcs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
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendNotificationStep = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ exports.sendNotificationStep = (0, workflows_sdk_1.createStep)("send-notification", async (data, { container }) => {
7
+ const notificationModuleService = container.resolve(utils_1.Modules.NOTIFICATION);
8
+ const notification = await notificationModuleService.createNotifications(data);
9
+ return new workflows_sdk_1.StepResponse(notification);
10
+ });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1ub3RpZmljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3NlbmQtbm90aWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUFtRDtBQUNuRCxxRUFBNEU7QUFHL0QsUUFBQSxvQkFBb0IsR0FBRyxJQUFBLDBCQUFVLEVBQzVDLG1CQUFtQixFQUNuQixLQUFLLEVBQUUsSUFBNkIsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDckQsTUFBTSx5QkFBeUIsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUNqRCxlQUFPLENBQUMsWUFBWSxDQUNyQixDQUFBO0lBQ0QsTUFBTSxZQUFZLEdBQUcsTUFBTSx5QkFBeUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM5RSxPQUFPLElBQUksNEJBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQTtBQUN2QyxDQUFDLENBQ0YsQ0FBQSJ9
package/README.md ADDED
@@ -0,0 +1,64 @@
1
+ <p align="center">
2
+ <a href="https://www.medusajs.com">
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/59018053/229103275-b5e482bb-4601-46e6-8142-244f531cebdb.svg">
5
+ <source media="(prefers-color-scheme: light)" srcset="https://user-images.githubusercontent.com/59018053/229103726-e5b529a3-9b3f-4970-8a1f-c6af37f087bf.svg">
6
+ <img alt="Medusa logo" src="https://user-images.githubusercontent.com/59018053/229103726-e5b529a3-9b3f-4970-8a1f-c6af37f087bf.svg">
7
+ </picture>
8
+ </a>
9
+ </p>
10
+ <h1 align="center">
11
+ Medusa Plugin Starter
12
+ </h1>
13
+
14
+ <h4 align="center">
15
+ <a href="https://docs.medusajs.com">Documentation</a> |
16
+ <a href="https://www.medusajs.com">Website</a>
17
+ </h4>
18
+
19
+ <p align="center">
20
+ Building blocks for digital commerce
21
+ </p>
22
+ <p align="center">
23
+ <a href="https://github.com/medusajs/medusa/blob/master/CONTRIBUTING.md">
24
+ <img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat" alt="PRs welcome!" />
25
+ </a>
26
+ <a href="https://www.producthunt.com/posts/medusa"><img src="https://img.shields.io/badge/Product%20Hunt-%231%20Product%20of%20the%20Day-%23DA552E" alt="Product Hunt"></a>
27
+ <a href="https://discord.gg/xpCwq3Kfn8">
28
+ <img src="https://img.shields.io/badge/chat-on%20discord-7289DA.svg" alt="Discord Chat" />
29
+ </a>
30
+ <a href="https://twitter.com/intent/follow?screen_name=medusajs">
31
+ <img src="https://img.shields.io/twitter/follow/medusajs.svg?label=Follow%20@medusajs" alt="Follow @medusajs" />
32
+ </a>
33
+ </p>
34
+
35
+ ## Compatibility
36
+
37
+ This starter is compatible with versions >= 2.4.0 of `@medusajs/medusa`.
38
+
39
+ ## Getting Started
40
+
41
+ Visit the [Quickstart Guide](https://docs.medusajs.com/learn/installation) to set up a server.
42
+
43
+ Visit the [Plugins documentation](https://docs.medusajs.com/learn/fundamentals/plugins) to learn more about plugins and how to create them.
44
+
45
+ Visit the [Docs](https://docs.medusajs.com/learn/installation#get-started) to learn more about our system requirements.
46
+
47
+ ## What is Medusa
48
+
49
+ Medusa is a set of commerce modules and tools that allow you to build rich, reliable, and performant commerce applications without reinventing core commerce logic. The modules can be customized and used to build advanced ecommerce stores, marketplaces, or any product that needs foundational commerce primitives. All modules are open-source and freely available on npm.
50
+
51
+ Learn more about [Medusa’s architecture](https://docs.medusajs.com/learn/introduction/architecture) and [commerce modules](https://docs.medusajs.com/learn/fundamentals/modules/commerce-modules) in the Docs.
52
+
53
+ ## Community & Contributions
54
+
55
+ The community and core team are available in [GitHub Discussions](https://github.com/medusajs/medusa/discussions), where you can ask for support, discuss roadmap, and share ideas.
56
+
57
+ Join our [Discord server](https://discord.com/invite/medusajs) to meet other community members.
58
+
59
+ ## Other channels
60
+
61
+ - [GitHub Issues](https://github.com/medusajs/medusa/issues)
62
+ - [Twitter](https://twitter.com/medusajs)
63
+ - [LinkedIn](https://www.linkedin.com/company/medusajs)
64
+ - [Medusa Blog](https://medusajs.com/blog/)
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@kb0912/notification-brevo",
3
+ "version": "0.0.1",
4
+ "description": "A starter for Medusa plugins.",
5
+ "author": "Medusa (https://medusajs.com)",
6
+ "license": "MIT",
7
+ "files": [
8
+ ".medusa/server"
9
+ ],
10
+ "exports": {
11
+ "./package.json": "./package.json",
12
+ "./workflows": "./.medusa/server/src/workflows/index.js",
13
+ "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
14
+ "./modules/*": "./.medusa/server/src/modules/*/index.js",
15
+ "./providers/*": "./.medusa/server/src/providers/*/index.js",
16
+ "./*": "./.medusa/server/src/*.js"
17
+ },
18
+ "keywords": [
19
+ "medusa",
20
+ "plugin",
21
+ "medusa-plugin-other",
22
+ "medusa-plugin",
23
+ "medusa-v2"
24
+ ],
25
+ "scripts": {
26
+ "build": "medusa plugin:build",
27
+ "dev": "medusa plugin:develop",
28
+ "prepublishOnly": "medusa plugin:build"
29
+ },
30
+ "devDependencies": {
31
+ "@medusajs/admin-sdk": "2.4.0",
32
+ "@medusajs/cli": "2.4.0",
33
+ "@medusajs/framework": "2.4.0",
34
+ "@medusajs/icons": "2.4.0",
35
+ "@medusajs/medusa": "2.4.0",
36
+ "@medusajs/test-utils": "2.4.0",
37
+ "@medusajs/ui": "4.0.4",
38
+ "@mikro-orm/cli": "6.4.3",
39
+ "@mikro-orm/core": "6.4.3",
40
+ "@mikro-orm/knex": "6.4.3",
41
+ "@mikro-orm/migrations": "6.4.3",
42
+ "@mikro-orm/postgresql": "6.4.3",
43
+ "@swc/core": "1.5.7",
44
+ "@types/node": "^20.0.0",
45
+ "@types/react": "^18.3.2",
46
+ "@types/react-dom": "^18.2.25",
47
+ "awilix": "^8.0.1",
48
+ "pg": "^8.13.0",
49
+ "prop-types": "^15.8.1",
50
+ "react": "^18.2.0",
51
+ "react-dom": "^18.2.0",
52
+ "ts-node": "^10.9.2",
53
+ "typescript": "^5.6.2",
54
+ "vite": "^5.2.11",
55
+ "yalc": "^1.0.0-pre.53"
56
+ },
57
+ "peerDependencies": {
58
+ "@medusajs/admin-sdk": "2.4.0",
59
+ "@medusajs/cli": "2.4.0",
60
+ "@medusajs/framework": "2.4.0",
61
+ "@medusajs/icons": "2.4.0",
62
+ "@medusajs/medusa": "2.4.0",
63
+ "@medusajs/test-utils": "2.4.0",
64
+ "@medusajs/ui": "4.0.3",
65
+ "@mikro-orm/cli": "6.4.3",
66
+ "@mikro-orm/core": "6.4.3",
67
+ "@mikro-orm/knex": "6.4.3",
68
+ "@mikro-orm/migrations": "6.4.3",
69
+ "@mikro-orm/postgresql": "6.4.3",
70
+ "awilix": "^8.0.1",
71
+ "pg": "^8.13.0"
72
+ },
73
+ "engines": {
74
+ "node": ">=20"
75
+ },
76
+ "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
77
+ "dependencies": {
78
+ "@getbrevo/brevo": "^2.2.0"
79
+ },
80
+ "main": "index.js"
81
+ }