@kb0912/notification-brevo 1.0.16 → 2.0.0
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.
- package/.medusa/server/src/admin/index.js +1004 -3
- package/.medusa/server/src/admin/index.mjs +1004 -3
- package/.medusa/server/src/api/admin/brevo-plugin-settings/analytics/route.js +78 -0
- package/.medusa/server/src/api/admin/brevo-plugin-settings/route.js +27 -0
- package/.medusa/server/src/api/hooks/brevo-webhook/route.js +40 -0
- package/.medusa/server/src/jobs/abandoned-cart.js +5 -11
- package/.medusa/server/src/jobs/promotion-expiry-reminder.js +122 -0
- package/.medusa/server/src/jobs/review-request.js +106 -0
- package/.medusa/server/src/jobs/winback.js +108 -0
- package/.medusa/server/src/modules/brevo-settings/index.js +13 -0
- package/.medusa/server/src/modules/brevo-settings/migrations/Migration20260306173214.js +15 -0
- package/.medusa/server/src/modules/brevo-settings/migrations/Migration20260307045432.js +14 -0
- package/.medusa/server/src/modules/brevo-settings/migrations/Migration20260307075811.js +14 -0
- package/.medusa/server/src/modules/brevo-settings/models/brevo-settings.js +79 -0
- package/.medusa/server/src/modules/brevo-settings/service.js +114 -0
- package/.medusa/server/src/providers/notifications-brevo/services.js +321 -176
- package/.medusa/server/src/workflows/index.js +25 -0
- package/.medusa/server/src/workflows/send-abandoned-cart.js +37 -8
- package/.medusa/server/src/workflows/send-customer-created.js +159 -4
- package/.medusa/server/src/workflows/send-order-canceled.js +27 -3
- package/.medusa/server/src/workflows/send-order-confirmation.js +63 -10
- package/.medusa/server/src/workflows/send-order-delivered.js +52 -0
- package/.medusa/server/src/workflows/send-review-request.js +37 -0
- package/.medusa/server/src/workflows/send-shipment-confirmation.js +33 -10
- package/.medusa/server/src/workflows/send-winback.js +34 -0
- package/.medusa/server/src/workflows/steps/check-abandoned-carts.js +184 -58
- package/.medusa/server/src/workflows/steps/resolve-locale.js +25 -0
- package/.medusa/server/src/workflows/steps/send-multi-channel.js +81 -0
- package/.medusa/server/src/workflows/steps/send-notification.js +1 -1
- package/.medusa/server/src/workflows/steps/sync-brevo-contact.js +57 -0
- package/.medusa/server/src/workflows/steps/track-brevo-event.js +47 -0
- package/README.md +315 -60
- package/package.json +21 -23
- package/.medusa/server/src/api/admin/plugin/route.js +0 -7
- package/.medusa/server/src/config.js +0 -12
- package/.medusa/server/src/loaders/brevo.js +0 -13
- package/.medusa/server/src/subscribers/password-reset.js +0 -18
- package/.medusa/server/src/subscribers/promotion-new-customer-created.js +0 -21
- package/.medusa/server/src/workflows/send-password-reset.js +0 -30
- package/.medusa/server/src/workflows/send-promotion-notification.js +0 -24
|
@@ -1,230 +1,375 @@
|
|
|
1
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
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
3
|
const utils_1 = require("@medusajs/framework/utils");
|
|
37
|
-
const
|
|
4
|
+
const brevo_1 = require("@getbrevo/brevo");
|
|
38
5
|
class BrevoProviderService extends utils_1.AbstractNotificationProviderService {
|
|
39
6
|
constructor({ logger }, options) {
|
|
40
7
|
super();
|
|
41
8
|
this.options = options;
|
|
42
9
|
this.logger = logger;
|
|
43
10
|
if (!this.options.apiKey) {
|
|
44
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "BREVO_API_KEY
|
|
11
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "BREVO_API_KEY must be set");
|
|
45
12
|
}
|
|
46
13
|
if (!this.options.from) {
|
|
47
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "BREVO_FROM_EMAIL
|
|
14
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "BREVO_FROM_EMAIL must be set");
|
|
48
15
|
}
|
|
49
|
-
this.
|
|
50
|
-
this.
|
|
16
|
+
this.brevo = new brevo_1.BrevoClient({ apiKey: this.options.apiKey });
|
|
17
|
+
this.logger.info(`[Brevo] Provider initialized successfully`);
|
|
51
18
|
}
|
|
19
|
+
// ─── Utility ───
|
|
52
20
|
humanPrice(amount, currencyCode) {
|
|
53
21
|
if (!amount)
|
|
54
|
-
return "0
|
|
55
|
-
|
|
22
|
+
return "0";
|
|
23
|
+
return new Intl.NumberFormat([], {
|
|
56
24
|
style: "currency",
|
|
57
25
|
currencyDisplay: "narrowSymbol",
|
|
58
|
-
currency: currencyCode,
|
|
59
|
-
});
|
|
60
|
-
return formatter.format(amount);
|
|
26
|
+
currency: currencyCode,
|
|
27
|
+
}).format(amount);
|
|
61
28
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
29
|
+
mapPaymentMethod(providerId) {
|
|
30
|
+
if (!providerId)
|
|
31
|
+
return "Unknown";
|
|
32
|
+
const map = {
|
|
33
|
+
"pp_bank-transfer_bank-transfer": "Bank Transfer",
|
|
34
|
+
"pp_system_default": "Cash on Delivery",
|
|
35
|
+
};
|
|
36
|
+
if (providerId.startsWith("pp_stripe_"))
|
|
37
|
+
return "Credit Card";
|
|
38
|
+
return map[providerId] || providerId;
|
|
39
|
+
}
|
|
40
|
+
// ─── Template Resolution ───
|
|
41
|
+
resolveTemplateId(template, data) {
|
|
42
|
+
const s = data?._settings;
|
|
43
|
+
const o = this.options;
|
|
44
|
+
// Check if event is enabled in admin settings
|
|
45
|
+
const enabledMap = {
|
|
46
|
+
"order.placed": s?.order_placed_enabled,
|
|
47
|
+
"order.canceled": s?.order_canceled_enabled,
|
|
48
|
+
"order.delivered": s?.order_delivered_enabled,
|
|
49
|
+
"customer.created": s?.customer_created_enabled,
|
|
50
|
+
"promotion-new-customer": s?.promotion_enabled,
|
|
51
|
+
"shipment.confirmed": s?.shipment_confirmed_enabled,
|
|
52
|
+
"cart.abandoned": s?.abandoned_cart_enabled,
|
|
53
|
+
"cart.abandoned.discount": s?.abandoned_cart_enabled,
|
|
54
|
+
"review.request": s?.review_request_enabled,
|
|
55
|
+
"winback": s?.winback_enabled,
|
|
56
|
+
"promotion-expiry-reminder": s?.promotion_expiry_reminder_enabled,
|
|
57
|
+
};
|
|
58
|
+
// If settings exist and event is explicitly disabled, skip
|
|
59
|
+
if (s && enabledMap[template] === false) {
|
|
60
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, `Event "${template}" is disabled in settings.`);
|
|
61
|
+
}
|
|
62
|
+
// Multi-language: check locale-specific template override
|
|
63
|
+
// _locale comes from customer.metadata.preferred_locale (set by storefront)
|
|
64
|
+
const locale = data?._locale;
|
|
65
|
+
if (s?.multilang_enabled && s?.multilang_templates && locale) {
|
|
66
|
+
const localeMap = s.multilang_templates[locale];
|
|
67
|
+
if (localeMap && localeMap[template]) {
|
|
68
|
+
const localeId = parseInt(localeMap[template], 10);
|
|
69
|
+
if (!isNaN(localeId) && localeId > 0) {
|
|
70
|
+
this.logger.info(`[Brevo] Using locale "${locale}" template ${localeId} for "${template}"`);
|
|
71
|
+
return localeId;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Locale configured but no template for this event → fall through to default
|
|
75
|
+
}
|
|
76
|
+
// Default template ID: DB settings > env vars
|
|
77
|
+
const templateMap = {
|
|
78
|
+
"order.placed": s?.order_placed_template_id || o.orderPlacedTemplateId,
|
|
79
|
+
"order.canceled": s?.order_canceled_template_id || o.orderCanceledTemplateId,
|
|
80
|
+
"order.delivered": s?.order_delivered_template_id || o.orderDeliveredTemplateId,
|
|
81
|
+
"customer.created": s?.customer_created_template_id || o.customerCreatedTemplateId,
|
|
82
|
+
"promotion-new-customer": s?.promotion_new_customer_template_id || o.promotionNewCustomerTemplateId,
|
|
83
|
+
"shipment.confirmed": s?.shipment_confirmed_template_id || o.shipmentConfirmedTemplateId,
|
|
84
|
+
"cart.abandoned": s?.abandoned_cart_template_id || o.abandonedCartTemplateId,
|
|
85
|
+
"cart.abandoned.discount": s?.abandoned_cart_discount_template_id || s?.abandoned_cart_template_id || o.abandonedCartTemplateId,
|
|
86
|
+
"review.request": s?.review_request_template_id,
|
|
87
|
+
"winback": s?.winback_template_id,
|
|
88
|
+
"promotion-expiry-reminder": s?.promotion_expiry_reminder_template_id,
|
|
89
|
+
};
|
|
90
|
+
const raw = templateMap[template];
|
|
91
|
+
const id = parseInt(raw || "", 10);
|
|
92
|
+
if (isNaN(id) || id === 0) {
|
|
93
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Template ID for "${template}" is not configured.`);
|
|
94
|
+
}
|
|
95
|
+
return id;
|
|
96
|
+
}
|
|
97
|
+
// ─── Params Builder ───
|
|
98
|
+
buildParams(template, data) {
|
|
66
99
|
switch (template) {
|
|
67
|
-
case "order.placed":
|
|
68
|
-
templateId = parseInt(this.options.orderPlacedTemplateId);
|
|
100
|
+
case "order.placed": {
|
|
69
101
|
const order = data.order;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
shipping_address: order?.shipping_address,
|
|
98
|
-
billing_address: order?.billing_address,
|
|
99
|
-
shipping_subtotal: this.humanPrice(order?.shipping_subtotal, order?.currency_code),
|
|
100
|
-
shipping_methods: order?.shipping_methods,
|
|
101
|
-
payment_collections: order?.payment_collections[0]?.payments.map(payment => ({
|
|
102
|
-
...payment,
|
|
103
|
-
provider_id: mapPaymentMethod(payment.provider_id) // Ánh xạ provider_id
|
|
102
|
+
if (!order)
|
|
103
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order data missing");
|
|
104
|
+
return {
|
|
105
|
+
order_id: order.id,
|
|
106
|
+
email: order.email,
|
|
107
|
+
currency_code: order.currency_code,
|
|
108
|
+
date_placed: new Date(order.created_at).toLocaleDateString(),
|
|
109
|
+
display_id: order.display_id,
|
|
110
|
+
total: this.humanPrice(order.total, order.currency_code),
|
|
111
|
+
customer_name: [order.shipping_address?.first_name, order.shipping_address?.last_name].filter(Boolean).join(" "),
|
|
112
|
+
items: Array.isArray(order.items)
|
|
113
|
+
? order.items.map((item) => ({
|
|
114
|
+
...item,
|
|
115
|
+
unit_price: this.humanPrice(item.unit_price, order.currency_code),
|
|
116
|
+
total: this.humanPrice(item.total, order.currency_code),
|
|
117
|
+
thumbnail: item.thumbnail,
|
|
118
|
+
title: item.product_title,
|
|
119
|
+
description: item.product_description,
|
|
120
|
+
}))
|
|
121
|
+
: [],
|
|
122
|
+
shipping_address: order.shipping_address,
|
|
123
|
+
billing_address: order.billing_address,
|
|
124
|
+
shipping_subtotal: this.humanPrice(order.shipping_subtotal, order.currency_code),
|
|
125
|
+
shipping_methods: order.shipping_methods || [],
|
|
126
|
+
payment_collections: order.payment_collections?.[0]?.payments?.map((p) => ({
|
|
127
|
+
...p,
|
|
128
|
+
provider_id: this.mapPaymentMethod(p.provider_id),
|
|
104
129
|
})) || [],
|
|
105
|
-
fulfillments: order
|
|
130
|
+
fulfillments: order.fulfillments || [],
|
|
106
131
|
};
|
|
107
|
-
|
|
108
|
-
case "order.canceled":
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
132
|
+
}
|
|
133
|
+
case "order.canceled": {
|
|
134
|
+
const order = data.order;
|
|
135
|
+
if (!order)
|
|
136
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order data missing");
|
|
137
|
+
return {
|
|
138
|
+
order_id: order.id,
|
|
139
|
+
display_id: order.display_id,
|
|
140
|
+
customer_name: [order.shipping_address?.first_name, order.shipping_address?.last_name].filter(Boolean).join(" ") ||
|
|
141
|
+
order.billing_address?.first_name || "",
|
|
113
142
|
};
|
|
114
|
-
|
|
115
|
-
case "
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
143
|
+
}
|
|
144
|
+
case "order.delivered": {
|
|
145
|
+
const fulfillment = data.fulfillment;
|
|
146
|
+
const order = fulfillment?.order;
|
|
147
|
+
if (!order)
|
|
148
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order data missing for delivery");
|
|
149
|
+
return {
|
|
150
|
+
customer_name: [order.shipping_address?.first_name, order.shipping_address?.last_name].filter(Boolean).join(" "),
|
|
151
|
+
order: {
|
|
152
|
+
display_id: order.display_id,
|
|
153
|
+
date: new Date(order.created_at).toLocaleDateString(),
|
|
154
|
+
shipping_address: order.shipping_address,
|
|
155
|
+
items: Array.isArray(order.items)
|
|
156
|
+
? order.items.map((item) => ({
|
|
157
|
+
title: item.product_title,
|
|
158
|
+
quantity: item.quantity,
|
|
159
|
+
unit_price: this.humanPrice(item.unit_price, order.currency_code),
|
|
160
|
+
}))
|
|
161
|
+
: [],
|
|
162
|
+
total: this.humanPrice(order.total, order.currency_code),
|
|
163
|
+
},
|
|
121
164
|
};
|
|
122
|
-
|
|
123
|
-
case "
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
165
|
+
}
|
|
166
|
+
case "customer.created": {
|
|
167
|
+
const customer = data.customer;
|
|
168
|
+
if (!customer)
|
|
169
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer data missing");
|
|
170
|
+
return {
|
|
127
171
|
name: [customer.first_name, customer.last_name].filter(Boolean).join(" "),
|
|
128
172
|
phone: customer.phone,
|
|
129
173
|
customer_id: customer.id,
|
|
130
|
-
email: data.email,
|
|
131
|
-
token: data.token,
|
|
132
174
|
};
|
|
133
|
-
|
|
175
|
+
}
|
|
134
176
|
case "promotion-new-customer":
|
|
135
|
-
|
|
136
|
-
params = {
|
|
177
|
+
return {
|
|
137
178
|
first_name: data.first_name,
|
|
138
179
|
last_name: data.last_name,
|
|
139
180
|
phone: data.phone,
|
|
140
181
|
ends_at: data.ends_at,
|
|
141
182
|
promotion_code: data.promotion_code,
|
|
142
183
|
};
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
?.filter(Boolean)
|
|
151
|
-
const trackingUrl = shipmentFulfillment?.labels
|
|
152
|
-
?.map((label) => label.tracking_url)
|
|
153
|
-
?.filter(Boolean) || [];
|
|
154
|
-
const shippingAddress = shipmentFulfillment?.order?.shipping_address;
|
|
155
|
-
params = {
|
|
156
|
-
customer_name: shippingAddress?.first_name + " " + shippingAddress?.last_name,
|
|
157
|
-
shipped_at: shipmentFulfillment?.shipped_at,
|
|
184
|
+
case "shipment.confirmed": {
|
|
185
|
+
const f = data.fulfillment;
|
|
186
|
+
if (!f)
|
|
187
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Fulfillment data missing");
|
|
188
|
+
const trackingNumbers = f.labels?.map((l) => l.tracking_number)?.filter(Boolean) || [];
|
|
189
|
+
const trackingUrls = f.labels?.map((l) => l.tracking_url)?.filter(Boolean) || [];
|
|
190
|
+
return {
|
|
191
|
+
customer_name: [f.order?.shipping_address?.first_name, f.order?.shipping_address?.last_name].filter(Boolean).join(" "),
|
|
158
192
|
tracking_number: trackingNumbers[0] || "",
|
|
159
|
-
tracking_url:
|
|
193
|
+
tracking_url: trackingUrls[0] || "",
|
|
160
194
|
order: {
|
|
161
|
-
display_id:
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
shipping_address: shipmentFulfillment?.order?.shipping_address,
|
|
165
|
-
billing_address: shipmentFulfillment?.order?.billing_address,
|
|
166
|
-
items: Array.isArray(shipmentFulfillment?.order?.items)
|
|
167
|
-
? shipmentFulfillment.order.items.map((item) => ({
|
|
195
|
+
display_id: f.order?.display_id,
|
|
196
|
+
items: Array.isArray(f.order?.items)
|
|
197
|
+
? f.order.items.map((item) => ({
|
|
168
198
|
title: item.product_title,
|
|
169
|
-
description: item.product_description,
|
|
170
199
|
quantity: item.quantity,
|
|
171
|
-
unit_price: this.humanPrice(item.unit_price,
|
|
200
|
+
unit_price: this.humanPrice(item.unit_price, f.order?.currency_code),
|
|
172
201
|
}))
|
|
173
202
|
: [],
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
}
|
|
203
|
+
total: this.humanPrice(f.order?.total, f.order?.currency_code),
|
|
204
|
+
shipping_address: f.order?.shipping_address,
|
|
205
|
+
},
|
|
178
206
|
};
|
|
179
|
-
|
|
207
|
+
}
|
|
180
208
|
case "cart.abandoned":
|
|
181
|
-
|
|
209
|
+
case "cart.abandoned.discount": {
|
|
182
210
|
const cart = data.cart;
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
211
|
+
if (!cart)
|
|
212
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Cart data missing");
|
|
213
|
+
const params = {
|
|
214
|
+
cart_id: cart.id,
|
|
215
|
+
name: [cart.customer?.first_name, cart.customer?.last_name].filter(Boolean).join(" ") || "",
|
|
216
|
+
items: Array.isArray(cart.items)
|
|
217
|
+
? cart.items.map((item) => ({
|
|
218
|
+
title: item.product_title,
|
|
219
|
+
thumbnail: item.thumbnail,
|
|
220
|
+
quantity: item.quantity,
|
|
221
|
+
unit_price: this.humanPrice(item.unit_price, cart.currency_code),
|
|
222
|
+
total: this.humanPrice(item.total, cart.currency_code),
|
|
223
|
+
}))
|
|
224
|
+
: [],
|
|
225
|
+
};
|
|
226
|
+
// Add discount code if present
|
|
227
|
+
if (data.promotion_code) {
|
|
228
|
+
params.promotion_code = data.promotion_code;
|
|
229
|
+
params.discount_value = data.discount_value;
|
|
230
|
+
params.discount_type = data.discount_type;
|
|
231
|
+
params.discount_expires_at = data.discount_expires_at;
|
|
232
|
+
}
|
|
233
|
+
return params;
|
|
234
|
+
}
|
|
235
|
+
case "review.request": {
|
|
236
|
+
const order = data.order;
|
|
237
|
+
if (!order)
|
|
238
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order data missing for review");
|
|
239
|
+
return {
|
|
240
|
+
customer_name: [order.shipping_address?.first_name, order.shipping_address?.last_name].filter(Boolean).join(" "),
|
|
241
|
+
display_id: order.display_id,
|
|
242
|
+
items: Array.isArray(order.items)
|
|
243
|
+
? order.items.map((item) => ({
|
|
244
|
+
title: item.product_title,
|
|
245
|
+
thumbnail: item.thumbnail,
|
|
246
|
+
}))
|
|
247
|
+
: [],
|
|
198
248
|
};
|
|
199
|
-
|
|
249
|
+
}
|
|
250
|
+
case "promotion-expiry-reminder":
|
|
251
|
+
return {
|
|
252
|
+
first_name: data.first_name,
|
|
253
|
+
last_name: data.last_name,
|
|
254
|
+
promotion_code: data.promotion_code,
|
|
255
|
+
expires_at: data.expires_at,
|
|
256
|
+
days_left: data.days_left,
|
|
257
|
+
};
|
|
258
|
+
case "winback": {
|
|
259
|
+
return {
|
|
260
|
+
customer_name: data.customer_name || "",
|
|
261
|
+
last_order_date: data.last_order_date || "",
|
|
262
|
+
days_inactive: data.days_inactive || 0,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
200
265
|
default:
|
|
201
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Template ${template} is not supported`);
|
|
202
|
-
}
|
|
203
|
-
if (isNaN(templateId) || templateId === 0) {
|
|
204
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Template ID for ${template} is not set in options`);
|
|
266
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Template "${template}" is not supported`);
|
|
205
267
|
}
|
|
268
|
+
}
|
|
269
|
+
// ─── Core Send ───
|
|
270
|
+
async send(notification) {
|
|
271
|
+
const { to, template, data } = notification;
|
|
206
272
|
if (!to) {
|
|
207
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `
|
|
273
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Recipient missing for "${template}"`);
|
|
208
274
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
275
|
+
// Resolve template — catches "disabled" and "not configured" gracefully
|
|
276
|
+
let templateId;
|
|
277
|
+
try {
|
|
278
|
+
templateId = this.resolveTemplateId(template, data);
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
if (error?.type === utils_1.MedusaError.Types.NOT_ALLOWED) {
|
|
282
|
+
this.logger.info(`[Brevo] Skipped (disabled): ${template} to ${to}`);
|
|
283
|
+
return { id: `skipped-${template}-${Date.now()}` };
|
|
284
|
+
}
|
|
285
|
+
if (error?.type === utils_1.MedusaError.Types.NOT_FOUND) {
|
|
286
|
+
this.logger.warn(`[Brevo] Skipped (no template): ${template} to ${to}`);
|
|
287
|
+
return { id: `no-template-${template}-${Date.now()}` };
|
|
288
|
+
}
|
|
289
|
+
throw error;
|
|
290
|
+
}
|
|
291
|
+
const params = this.buildParams(template, data);
|
|
292
|
+
try {
|
|
293
|
+
const result = await this.brevo.transactionalEmails.sendTransacEmail({
|
|
294
|
+
sender: {
|
|
295
|
+
email: this.options.from,
|
|
296
|
+
name: data?._settings?.sender_name || this.options.senderName || undefined,
|
|
297
|
+
},
|
|
298
|
+
to: [{ email: to }],
|
|
299
|
+
templateId,
|
|
300
|
+
params,
|
|
301
|
+
tags: [template],
|
|
302
|
+
});
|
|
303
|
+
this.logger.info(`[Brevo] Email sent to ${to} | template=${template} | id=${templateId}`);
|
|
304
|
+
return { id: result.messageId || `${template}-${Date.now()}` };
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
const msg = error?.message || "Unknown error";
|
|
308
|
+
this.logger.error(`[Brevo] Failed email to ${to} | template=${template} | error=${msg}`);
|
|
309
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to send email: ${msg}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// ─── Brevo Contact Sync ───
|
|
313
|
+
async syncContact(data) {
|
|
314
|
+
try {
|
|
315
|
+
await this.brevo.contacts.createContact({
|
|
316
|
+
email: data.email,
|
|
317
|
+
attributes: {
|
|
318
|
+
FIRSTNAME: data.firstName || "",
|
|
319
|
+
LASTNAME: data.lastName || "",
|
|
320
|
+
PHONE: data.phone || "",
|
|
321
|
+
...data.attributes,
|
|
322
|
+
},
|
|
323
|
+
listIds: data.listIds,
|
|
324
|
+
updateEnabled: true,
|
|
325
|
+
});
|
|
326
|
+
this.logger.info(`[Brevo] Contact synced: ${data.email}`);
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
this.logger.warn(`[Brevo] Contact sync failed for ${data.email}: ${error?.message}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// ─── Event Tracking ───
|
|
333
|
+
async trackEvent(data) {
|
|
334
|
+
try {
|
|
335
|
+
await this.brevo.event.trackEvent({
|
|
336
|
+
email: data.email,
|
|
337
|
+
event: data.event,
|
|
338
|
+
eventdata: data.eventdata,
|
|
339
|
+
});
|
|
340
|
+
this.logger.info(`[Brevo] Event tracked: ${data.event} for ${data.email}`);
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
this.logger.warn(`[Brevo] Event tracking failed: ${data.event} - ${error?.message}`);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// ─── SMS ───
|
|
347
|
+
async sendSms(data) {
|
|
348
|
+
try {
|
|
349
|
+
await this.brevo.transactionalSms.sendTransacSms({
|
|
350
|
+
sender: data.sender || this.options.senderName || "Medusa",
|
|
351
|
+
recipient: data.to,
|
|
352
|
+
content: data.content,
|
|
353
|
+
});
|
|
354
|
+
this.logger.info(`[Brevo] SMS sent to ${data.to}`);
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
this.logger.warn(`[Brevo] SMS failed to ${data.to}: ${error?.message}`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// ─── WhatsApp ───
|
|
361
|
+
async sendWhatsApp(data) {
|
|
218
362
|
try {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
363
|
+
await this.brevo.transactionalWhatsApp.sendWhatsAppMessage({
|
|
364
|
+
senderNumber: this.options.from,
|
|
365
|
+
contactNumbers: [data.to],
|
|
366
|
+
templateName: data.templateName,
|
|
367
|
+
bodyVariables: data.params ? Object.values(data.params).map(String) : [],
|
|
368
|
+
});
|
|
369
|
+
this.logger.info(`[Brevo] WhatsApp sent to ${data.to} | template=${data.templateName}`);
|
|
224
370
|
}
|
|
225
371
|
catch (error) {
|
|
226
|
-
this.logger.
|
|
227
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Email is not send");
|
|
372
|
+
this.logger.warn(`[Brevo] WhatsApp failed to ${data.to}: ${error?.message}`);
|
|
228
373
|
}
|
|
229
374
|
}
|
|
230
375
|
async resend(notification) {
|
|
@@ -233,4 +378,4 @@ class BrevoProviderService extends utils_1.AbstractNotificationProviderService {
|
|
|
233
378
|
}
|
|
234
379
|
BrevoProviderService.identifier = "brevo";
|
|
235
380
|
exports.default = BrevoProviderService;
|
|
236
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL25vdGlmaWNhdGlvbnMtYnJldm8vc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFHbUM7QUFNbkMsdURBQXlDO0FBT3pDLE1BQU0sb0JBQXFCLFNBQVEsMkNBQW1DO0lBT3JFLFlBQVksRUFDWCxNQUFNLEVBR04sRUFBRSxPQUE0QjtRQUM5QixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBRXJCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxtQkFBVyxDQUNwQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDhCQUE4QixDQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxtQkFBVyxDQUNwQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLGlDQUFpQyxDQUNqQyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FDekIsS0FBSyxDQUFDLDZCQUE2QixDQUFDLE1BQU0sRUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZO1FBQzlCLElBQUksQ0FBQyxNQUFNO1lBQ1YsT0FBTyxNQUFNLENBQUM7UUFFZixNQUFNLFNB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
|
|
381
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL25vdGlmaWNhdGlvbnMtYnJldm8vc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFHa0M7QUFPbEMsMkNBQTZDO0FBRTdDLE1BQU0sb0JBQXFCLFNBQVEsMkNBQW1DO0lBT3JFLFlBQ0MsRUFBRSxNQUFNLEVBQXNCLEVBQzlCLE9BQTRCO1FBRTVCLEtBQUssRUFBRSxDQUFBO1FBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFFcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLG1CQUFXLENBQUMsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLDJCQUEyQixDQUFDLENBQUE7UUFDbkYsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSw4QkFBOEIsQ0FBQyxDQUFBO1FBQ3RGLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksbUJBQVcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsa0JBQWtCO0lBRWxCLFVBQVUsQ0FBQyxNQUFpQyxFQUFFLFlBQW9CO1FBQ2pFLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxHQUFHLENBQUE7UUFDdkIsT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFF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
|