@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.
Files changed (40) hide show
  1. package/.medusa/server/src/admin/index.js +1004 -3
  2. package/.medusa/server/src/admin/index.mjs +1004 -3
  3. package/.medusa/server/src/api/admin/brevo-plugin-settings/analytics/route.js +78 -0
  4. package/.medusa/server/src/api/admin/brevo-plugin-settings/route.js +27 -0
  5. package/.medusa/server/src/api/hooks/brevo-webhook/route.js +40 -0
  6. package/.medusa/server/src/jobs/abandoned-cart.js +5 -11
  7. package/.medusa/server/src/jobs/promotion-expiry-reminder.js +122 -0
  8. package/.medusa/server/src/jobs/review-request.js +106 -0
  9. package/.medusa/server/src/jobs/winback.js +108 -0
  10. package/.medusa/server/src/modules/brevo-settings/index.js +13 -0
  11. package/.medusa/server/src/modules/brevo-settings/migrations/Migration20260306173214.js +15 -0
  12. package/.medusa/server/src/modules/brevo-settings/migrations/Migration20260307045432.js +14 -0
  13. package/.medusa/server/src/modules/brevo-settings/migrations/Migration20260307075811.js +14 -0
  14. package/.medusa/server/src/modules/brevo-settings/models/brevo-settings.js +79 -0
  15. package/.medusa/server/src/modules/brevo-settings/service.js +114 -0
  16. package/.medusa/server/src/providers/notifications-brevo/services.js +321 -176
  17. package/.medusa/server/src/workflows/index.js +25 -0
  18. package/.medusa/server/src/workflows/send-abandoned-cart.js +37 -8
  19. package/.medusa/server/src/workflows/send-customer-created.js +159 -4
  20. package/.medusa/server/src/workflows/send-order-canceled.js +27 -3
  21. package/.medusa/server/src/workflows/send-order-confirmation.js +63 -10
  22. package/.medusa/server/src/workflows/send-order-delivered.js +52 -0
  23. package/.medusa/server/src/workflows/send-review-request.js +37 -0
  24. package/.medusa/server/src/workflows/send-shipment-confirmation.js +33 -10
  25. package/.medusa/server/src/workflows/send-winback.js +34 -0
  26. package/.medusa/server/src/workflows/steps/check-abandoned-carts.js +184 -58
  27. package/.medusa/server/src/workflows/steps/resolve-locale.js +25 -0
  28. package/.medusa/server/src/workflows/steps/send-multi-channel.js +81 -0
  29. package/.medusa/server/src/workflows/steps/send-notification.js +1 -1
  30. package/.medusa/server/src/workflows/steps/sync-brevo-contact.js +57 -0
  31. package/.medusa/server/src/workflows/steps/track-brevo-event.js +47 -0
  32. package/README.md +315 -60
  33. package/package.json +21 -23
  34. package/.medusa/server/src/api/admin/plugin/route.js +0 -7
  35. package/.medusa/server/src/config.js +0 -12
  36. package/.medusa/server/src/loaders/brevo.js +0 -13
  37. package/.medusa/server/src/subscribers/password-reset.js +0 -18
  38. package/.medusa/server/src/subscribers/promotion-new-customer-created.js +0 -21
  39. package/.medusa/server/src/workflows/send-password-reset.js +0 -30
  40. 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 Brevo = __importStar(require("@getbrevo/brevo"));
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 need to be set");
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 need to be set");
14
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "BREVO_FROM_EMAIL must be set");
48
15
  }
49
- this.apiInstance = new Brevo.TransactionalEmailsApi();
50
- this.apiInstance.setApiKey(Brevo.TransactionalEmailsApiApiKeys.apiKey, this.options.apiKey);
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.00";
55
- const formatter = new Intl.NumberFormat([], {
22
+ return "0";
23
+ return new Intl.NumberFormat([], {
56
24
  style: "currency",
57
25
  currencyDisplay: "narrowSymbol",
58
- currency: currencyCode, // "VND"
59
- });
60
- return formatter.format(amount);
26
+ currency: currencyCode,
27
+ }).format(amount);
61
28
  }
62
- async send(notification) {
63
- const { to, template, data } = notification;
64
- let templateId;
65
- let params;
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
- const paymentMethodMap = {
71
- "pp_bank-transfer_bank-transfer": "Bank Transfer",
72
- "pp_stripe_stripe": "Credit Card",
73
- "pp_system_default": "Cash on Delivery",
74
- };
75
- const mapPaymentMethod = (providerId) => {
76
- if (providerId && providerId.startsWith("pp_stripe_")) {
77
- return "Credit Card";
78
- }
79
- return paymentMethodMap[providerId] || providerId;
80
- };
81
- params = {
82
- order_id: order?.id,
83
- email: order?.email,
84
- currency_code: order?.currency_code,
85
- date_placed: new Date(order?.created_at).toLocaleDateString(),
86
- display_id: order?.display_id,
87
- total: this.humanPrice(order?.total, order?.currency_code),
88
- customer_name: `${order?.shipping_address?.first_name} ${order?.shipping_address?.last_name}`, // Full name
89
- items: order?.items.map((item) => ({
90
- ...item,
91
- unit_price: this.humanPrice(item.unit_price, order?.currency_code),
92
- total: this.humanPrice(item.total, order?.currency_code),
93
- thumbnail: item.thumbnail,
94
- title: item.product_title,
95
- description: item.product_description
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?.fulfillments,
130
+ fulfillments: order.fulfillments || [],
106
131
  };
107
- break;
108
- case "order.canceled":
109
- templateId = parseInt(this.options.orderCanceledTemplateId);
110
- params = {
111
- order_id: data.order?.id,
112
- customer_name: data.order?.billing_address?.first_name,
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
- break;
115
- case "customer.created":
116
- templateId = parseInt(this.options.customerCreatedTemplateId);
117
- params = {
118
- name: data.customer?.first_name + " " + (data.customer?.last_name || ""),
119
- phone: data.customer?.phone,
120
- customer_id: data.customer?.id,
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
- break;
123
- case "password.reset":
124
- templateId = parseInt(this.options.passwordResetTemplate);
125
- const customer = data.customer || {};
126
- params = {
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
- break;
175
+ }
134
176
  case "promotion-new-customer":
135
- templateId = parseInt(this.options.promotionNewCustomerTemplateId);
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
- break;
144
- case "shipment.confirmed":
145
- templateId = parseInt(this.options.shipmentConfirmedTemplateId);
146
- const shipmentFulfillment = data.fulfillment;
147
- const shippedAt = shipmentFulfillment?.shipped_at;
148
- const trackingNumbers = shipmentFulfillment?.labels
149
- ?.map((label) => label.tracking_number)
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: trackingUrl[0] || "",
193
+ tracking_url: trackingUrls[0] || "",
160
194
  order: {
161
- display_id: shipmentFulfillment?.order?.display_id,
162
- date: new Date(shipmentFulfillment?.order?.created_at).toLocaleDateString(),
163
- shipping_methods: shipmentFulfillment?.order?.shipping_methods || [],
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, shipmentFulfillment?.order?.currency_code),
200
+ unit_price: this.humanPrice(item.unit_price, f.order?.currency_code),
172
201
  }))
173
202
  : [],
174
- subtotal: this.humanPrice(shipmentFulfillment?.order?.subtotal, shipmentFulfillment?.order?.currency_code),
175
- shipping_total: this.humanPrice(shipmentFulfillment?.order?.shipping_total, shipmentFulfillment?.order?.currency_code),
176
- total: this.humanPrice(shipmentFulfillment?.order?.total, shipmentFulfillment?.order?.currency_code),
177
- }
203
+ total: this.humanPrice(f.order?.total, f.order?.currency_code),
204
+ shipping_address: f.order?.shipping_address,
205
+ },
178
206
  };
179
- break;
207
+ }
180
208
  case "cart.abandoned":
181
- templateId = parseInt(this.options.abandonedCartTemplateId);
209
+ case "cart.abandoned.discount": {
182
210
  const cart = data.cart;
183
- params = {
184
- cart_id: cart?.id,
185
- created_at: cart?.created_at,
186
- name: cart?.name,
187
- phone: cart?.phone,
188
- currency_code: cart?.currency_code,
189
- items: cart?.items.map((item) => ({
190
- ...item,
191
- unit_price: this.humanPrice(item.unit_price, cart?.currency_code),
192
- total: this.humanPrice(item.total, cart?.currency_code),
193
- thumbnail: item.thumbnail,
194
- title: item.product_title,
195
- description: item.product_description,
196
- variant_title: item.variant_title, // thêm nếu bạn cần hiển thị trong "Size"
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
- break;
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, `Email is not found for ${template}`);
273
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Recipient missing for "${template}"`);
208
274
  }
209
- const sendSmtpEmail = new Brevo.SendSmtpEmail();
210
- sendSmtpEmail.sender = {
211
- email: this.options.from
212
- };
213
- sendSmtpEmail.to = [{
214
- email: to
215
- }];
216
- sendSmtpEmail.templateId = templateId;
217
- sendSmtpEmail.params = params;
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
- const response = await this.apiInstance.sendTransacEmail(sendSmtpEmail);
220
- this.logger.info(`Email sent to ${to} for template ${template}`);
221
- return {
222
- id: `${template}-${Date.now()}`,
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.error(`Error while sending email ${to}:`, error);
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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