@infuro/cms-core 1.0.60 → 1.0.62
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/dist/admin.cjs +4179 -2665
- package/dist/admin.js +2990 -1476
- package/dist/api.cjs +41 -37
- package/dist/api.js +9 -5
- package/dist/{chunk-URN7GS23.js → chunk-6LV36PCL.js} +199 -1059
- package/dist/{chunk-O2642WVS.js → chunk-6XAVZE4I.js} +17 -3
- package/dist/{chunk-BXYZDMTZ.cjs → chunk-AXMP2U43.cjs} +3 -94
- package/dist/{chunk-T3HPSF7K.js → chunk-AYWDQFJZ.js} +3 -0
- package/dist/chunk-CTIEAHQL.cjs +96 -0
- package/dist/chunk-GWDI752Q.js +83 -0
- package/dist/chunk-GZGFNVTK.js +886 -0
- package/dist/chunk-H3IVLIPR.cjs +86 -0
- package/dist/{chunk-2KUCQVAQ.js → chunk-HMLVPIJR.js} +2 -91
- package/dist/{chunk-V25RDUOU.cjs → chunk-LRD4CGOG.cjs} +38 -4
- package/dist/{chunk-73WVHINE.cjs → chunk-LVQSG25Y.cjs} +18 -4
- package/dist/chunk-NMYGQWHV.js +93 -0
- package/dist/chunk-OVTOP42W.js +199 -0
- package/dist/{chunk-BSLNXKV2.cjs → chunk-QA5C477U.cjs} +927 -351
- package/dist/{chunk-JAEUYYGA.js → chunk-R6Q67HAS.js} +876 -291
- package/dist/{chunk-YSYX4GUD.cjs → chunk-TWTISTZB.cjs} +210 -1080
- package/dist/{chunk-77I3KS7V.cjs → chunk-UEE4PTTB.cjs} +3 -0
- package/dist/chunk-WFMVD567.cjs +209 -0
- package/dist/{chunk-L3525VXI.js → chunk-YW7EF7K7.js} +36 -2
- package/dist/chunk-ZPAPCGCR.cjs +899 -0
- package/dist/{email-queue-OI2HSCGE.js → email-queue-65PQAG4C.js} +3 -2
- package/dist/{email-queue-6NJY6HNM.cjs → email-queue-J7DXYNCE.cjs} +7 -6
- package/dist/email-service-F7HA4X63.js +3 -0
- package/dist/email-service-RDOTY3CO.cjs +28 -0
- package/dist/{emit-order-notification-trigger-TNEZOYEE.cjs → emit-order-notification-trigger-K7URAZHJ.cjs} +4 -4
- package/dist/{emit-order-notification-trigger-CZU3V2WE.js → emit-order-notification-trigger-MD7EBODC.js} +2 -2
- package/dist/{erp-order-invoice-EYYNR526.cjs → erp-order-invoice-C5GZCOBM.cjs} +6 -5
- package/dist/{erp-order-invoice-3GXDE443.js → erp-order-invoice-MYFCXOCY.js} +2 -1
- package/dist/index.cjs +638 -346
- package/dist/index.d.cts +53 -19
- package/dist/index.d.ts +53 -19
- package/dist/index.js +350 -58
- package/dist/migrations/1783000000000-AddOrderPendingProcessingCompletedTriggers.ts +56 -0
- package/dist/migrations/1783100000000-AddSmsToOrderNotificationBindingsChannelEnum.ts +17 -0
- package/dist/migrations/1783200000000-AddOrderAssigneeColumns.ts +30 -0
- package/dist/order-assignees-handlers-LKMAGLG6.js +150 -0
- package/dist/order-assignees-handlers-NPKD64P6.cjs +152 -0
- package/dist/order-completion-otp-handlers-3NTOGEA5.js +361 -0
- package/dist/order-completion-otp-handlers-4EOLYLAP.cjs +363 -0
- package/dist/order-notification-dispatcher-IYMOS4VY.js +10 -0
- package/dist/order-notification-dispatcher-X2XM5VUY.cjs +35 -0
- package/dist/sms-notification-templates-handlers-SJLO7JGZ.js +47 -0
- package/dist/sms-notification-templates-handlers-YSB3L2PK.cjs +49 -0
- package/package.json +1 -1
- package/dist/order-notification-dispatcher-KJVGLK5E.cjs +0 -24
- package/dist/order-notification-dispatcher-ZSFKEYMP.js +0 -7
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { notificationTriggerEmitter } from './chunk-
|
|
1
|
+
import { notificationTriggerEmitter } from './chunk-AYWDQFJZ.js';
|
|
2
2
|
import { __name } from './chunk-SHUYVCID.js';
|
|
3
3
|
|
|
4
4
|
// src/lib/emit-order-notification-trigger.ts
|
|
@@ -77,7 +77,7 @@ async function emitOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
|
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
-
|
|
80
|
+
const triggerPayload = {
|
|
81
81
|
orderId,
|
|
82
82
|
orderNumber: String(fo.orderNumber ?? ""),
|
|
83
83
|
customerName: fo.contact?.name ?? "",
|
|
@@ -87,7 +87,21 @@ async function emitOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
|
|
|
87
87
|
vendorId: fo.vendorId ?? null,
|
|
88
88
|
extraVariables: extra?.extraVariables,
|
|
89
89
|
refundAmount: resolvedRefundAmount
|
|
90
|
-
}
|
|
90
|
+
};
|
|
91
|
+
if (listenerCount === 0) {
|
|
92
|
+
try {
|
|
93
|
+
const { dispatchOrderNotificationDirectly } = await import('./order-notification-dispatcher-IYMOS4VY.js');
|
|
94
|
+
await dispatchOrderNotificationDirectly(triggerKey, triggerPayload, deps.dataSource, deps.entityMap);
|
|
95
|
+
} catch (err) {
|
|
96
|
+
console.error("[notification-triggers] direct dispatch failed", {
|
|
97
|
+
triggerKey,
|
|
98
|
+
orderId,
|
|
99
|
+
err
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
notificationTriggerEmitter.emitTrigger(triggerKey, triggerPayload);
|
|
104
|
+
}
|
|
91
105
|
}
|
|
92
106
|
__name(emitOrderNotificationTrigger, "emitOrderNotificationTrigger");
|
|
93
107
|
function fireOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkUPLVMVRX_cjs = require('./chunk-UPLVMVRX.cjs');
|
|
4
|
+
var chunkCTIEAHQL_cjs = require('./chunk-CTIEAHQL.cjs');
|
|
4
5
|
var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
|
|
5
6
|
var pdfLib = require('pdf-lib');
|
|
6
7
|
|
|
@@ -585,96 +586,6 @@ function resolveInvoiceAssetUrl(raw) {
|
|
|
585
586
|
}
|
|
586
587
|
chunkUSNT2KNT_cjs.__name(resolveInvoiceAssetUrl, "resolveInvoiceAssetUrl");
|
|
587
588
|
|
|
588
|
-
// src/plugins/email/templates/types.ts
|
|
589
|
-
function normalizeSocialLinkItem(o) {
|
|
590
|
-
const url = String(o.url ?? "").trim();
|
|
591
|
-
if (!url) return null;
|
|
592
|
-
let iconUrl = String(o.iconUrl ?? o.icon_image ?? "").trim();
|
|
593
|
-
let icon = String(o.icon ?? "").trim();
|
|
594
|
-
if (!iconUrl && /^https?:\/\//i.test(icon)) {
|
|
595
|
-
iconUrl = icon;
|
|
596
|
-
icon = "";
|
|
597
|
-
}
|
|
598
|
-
const item = {
|
|
599
|
-
url
|
|
600
|
-
};
|
|
601
|
-
if (iconUrl) item.iconUrl = iconUrl;
|
|
602
|
-
if (icon) item.icon = icon;
|
|
603
|
-
return item;
|
|
604
|
-
}
|
|
605
|
-
chunkUSNT2KNT_cjs.__name(normalizeSocialLinkItem, "normalizeSocialLinkItem");
|
|
606
|
-
function parseSocialLinksJson(raw) {
|
|
607
|
-
if (raw == null || raw.trim() === "") return void 0;
|
|
608
|
-
try {
|
|
609
|
-
const parsed = JSON.parse(raw);
|
|
610
|
-
if (!Array.isArray(parsed)) return void 0;
|
|
611
|
-
const out = [];
|
|
612
|
-
for (const item of parsed) {
|
|
613
|
-
if (item && typeof item === "object" && "url" in item) {
|
|
614
|
-
const n = normalizeSocialLinkItem(item);
|
|
615
|
-
if (n) out.push(n);
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
return out.length ? out : void 0;
|
|
619
|
-
} catch {
|
|
620
|
-
return void 0;
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
chunkUSNT2KNT_cjs.__name(parseSocialLinksJson, "parseSocialLinksJson");
|
|
624
|
-
function mergeEmailLayoutCompanyDetails(branding, emailSettings) {
|
|
625
|
-
const fromBranding = getCompanyDetailsFromSettings(branding);
|
|
626
|
-
const pick = /* @__PURE__ */ chunkUSNT2KNT_cjs.__name((emailVal, fallback) => {
|
|
627
|
-
const t = emailVal?.trim();
|
|
628
|
-
return t || fallback?.trim() || void 0;
|
|
629
|
-
}, "pick");
|
|
630
|
-
const logoUrl = pick(emailSettings.logoUrl ?? emailSettings.emailLogoUrl, fromBranding.logoUrl);
|
|
631
|
-
const companyName = pick(emailSettings.companyName ?? emailSettings.emailCompanyName, fromBranding.companyName);
|
|
632
|
-
const supportEmail = pick(emailSettings.supportEmail ?? emailSettings.emailSupportEmail, fromBranding.supportEmail);
|
|
633
|
-
const supportPhone = pick(emailSettings.supportPhone, void 0);
|
|
634
|
-
const footerDisclaimer = pick(emailSettings.footerDisclaimer, void 0);
|
|
635
|
-
const followUsTitle = pick(emailSettings.followUsTitle, "Follow Us") || "Follow Us";
|
|
636
|
-
const socialFromEmail = parseSocialLinksJson(emailSettings.socialLinks);
|
|
637
|
-
const socialLinks = socialFromEmail?.length ? socialFromEmail : fromBranding.socialLinks;
|
|
638
|
-
return {
|
|
639
|
-
logoUrl,
|
|
640
|
-
companyName,
|
|
641
|
-
supportEmail,
|
|
642
|
-
supportPhone,
|
|
643
|
-
socialLinks,
|
|
644
|
-
footerDisclaimer,
|
|
645
|
-
followUsTitle
|
|
646
|
-
};
|
|
647
|
-
}
|
|
648
|
-
chunkUSNT2KNT_cjs.__name(mergeEmailLayoutCompanyDetails, "mergeEmailLayoutCompanyDetails");
|
|
649
|
-
function getCompanyDetailsFromSettings(settingsGroup) {
|
|
650
|
-
const logoUrl = settingsGroup.logo ?? settingsGroup.logoUrl ?? "";
|
|
651
|
-
const companyName = settingsGroup.companyName ?? settingsGroup.company_name ?? "";
|
|
652
|
-
const supportEmail = settingsGroup.supportEmail ?? settingsGroup.support_email ?? "";
|
|
653
|
-
let socialLinks = [];
|
|
654
|
-
const raw = settingsGroup.socialLinks ?? settingsGroup.social_links;
|
|
655
|
-
if (typeof raw === "string") {
|
|
656
|
-
try {
|
|
657
|
-
const arr = JSON.parse(raw);
|
|
658
|
-
if (Array.isArray(arr)) {
|
|
659
|
-
for (const item of arr) {
|
|
660
|
-
if (item && typeof item === "object") {
|
|
661
|
-
const n = normalizeSocialLinkItem(item);
|
|
662
|
-
if (n) socialLinks.push(n);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
} catch {
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
return {
|
|
670
|
-
logoUrl: logoUrl || void 0,
|
|
671
|
-
companyName: companyName || void 0,
|
|
672
|
-
supportEmail: supportEmail || void 0,
|
|
673
|
-
socialLinks: socialLinks.length ? socialLinks : void 0
|
|
674
|
-
};
|
|
675
|
-
}
|
|
676
|
-
chunkUSNT2KNT_cjs.__name(getCompanyDetailsFromSettings, "getCompanyDetailsFromSettings");
|
|
677
|
-
|
|
678
589
|
// src/lib/invoice/build-local-invoice-for-order.ts
|
|
679
590
|
async function loadSettingsGroup(ds, entityMap, group) {
|
|
680
591
|
if (!entityMap.configs) return {};
|
|
@@ -755,8 +666,8 @@ async function buildLocalInvoicePdfForOrder(ds, entityMap, orderId) {
|
|
|
755
666
|
loadSettingsGroup(ds, entityMap, "branding"),
|
|
756
667
|
loadSettingsGroup(ds, entityMap, "email")
|
|
757
668
|
]);
|
|
758
|
-
const companyDetails = mergeEmailLayoutCompanyDetails(branding, email);
|
|
759
|
-
const fromBranding = getCompanyDetailsFromSettings(branding);
|
|
669
|
+
const companyDetails = chunkCTIEAHQL_cjs.mergeEmailLayoutCompanyDetails(branding, email);
|
|
670
|
+
const fromBranding = chunkCTIEAHQL_cjs.getCompanyDetailsFromSettings(branding);
|
|
760
671
|
const rawLogo = store.invoiceLogoUrl || store.companyLogo || store.logo || companyDetails.logoUrl || fromBranding.logoUrl || null;
|
|
761
672
|
const logoUrl = resolveInvoiceAssetUrl(rawLogo);
|
|
762
673
|
const companyName = store.companyName || store.invoiceCompanyName || store.name || companyDetails.companyName || fromBranding.companyName || "Store";
|
|
@@ -941,11 +852,9 @@ exports.ORDER_INVOICE_EMAIL_ELIGIBLE_STATUSES = ORDER_INVOICE_EMAIL_ELIGIBLE_STA
|
|
|
941
852
|
exports.buildLocalInvoicePdfForOrder = buildLocalInvoicePdfForOrder;
|
|
942
853
|
exports.extractChildOrderRefsFromSalePayload = extractChildOrderRefsFromSalePayload;
|
|
943
854
|
exports.generateLocalInvoicePdf = generateLocalInvoicePdf;
|
|
944
|
-
exports.getCompanyDetailsFromSettings = getCompanyDetailsFromSettings;
|
|
945
855
|
exports.isOrderEligibleForInvoiceEmail = isOrderEligibleForInvoiceEmail;
|
|
946
856
|
exports.mapErpPayloadToFulfillment = mapErpPayloadToFulfillment;
|
|
947
857
|
exports.mapErpPayloadToInvoiceNumber = mapErpPayloadToInvoiceNumber;
|
|
948
|
-
exports.mergeEmailLayoutCompanyDetails = mergeEmailLayoutCompanyDetails;
|
|
949
858
|
exports.normalizeInvoiceTemplateId = normalizeInvoiceTemplateId;
|
|
950
859
|
exports.resolveInvoiceAssetUrl = resolveInvoiceAssetUrl;
|
|
951
860
|
exports.resolveOrderInvoicePdfBytes = resolveOrderInvoicePdfBytes;
|
|
@@ -2,6 +2,9 @@ import { __name } from './chunk-SHUYVCID.js';
|
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
3
|
|
|
4
4
|
var KNOWN_NOTIFICATION_TRIGGERS = {
|
|
5
|
+
ORDER_PENDING: "order_pending",
|
|
6
|
+
ORDER_PROCESSING: "order_processing",
|
|
7
|
+
ORDER_COMPLETED: "order_completed",
|
|
5
8
|
ORDER_PLACED: "order_placed",
|
|
6
9
|
ORDER_CANCELLED: "order_cancelled",
|
|
7
10
|
PAYMENT_SUCCESS: "payment_success",
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
|
|
4
|
+
|
|
5
|
+
// src/plugins/email/templates/types.ts
|
|
6
|
+
function normalizeSocialLinkItem(o) {
|
|
7
|
+
const url = String(o.url ?? "").trim();
|
|
8
|
+
if (!url) return null;
|
|
9
|
+
let iconUrl = String(o.iconUrl ?? o.icon_image ?? "").trim();
|
|
10
|
+
let icon = String(o.icon ?? "").trim();
|
|
11
|
+
if (!iconUrl && /^https?:\/\//i.test(icon)) {
|
|
12
|
+
iconUrl = icon;
|
|
13
|
+
icon = "";
|
|
14
|
+
}
|
|
15
|
+
const item = {
|
|
16
|
+
url
|
|
17
|
+
};
|
|
18
|
+
if (iconUrl) item.iconUrl = iconUrl;
|
|
19
|
+
if (icon) item.icon = icon;
|
|
20
|
+
return item;
|
|
21
|
+
}
|
|
22
|
+
chunkUSNT2KNT_cjs.__name(normalizeSocialLinkItem, "normalizeSocialLinkItem");
|
|
23
|
+
function parseSocialLinksJson(raw) {
|
|
24
|
+
if (raw == null || raw.trim() === "") return void 0;
|
|
25
|
+
try {
|
|
26
|
+
const parsed = JSON.parse(raw);
|
|
27
|
+
if (!Array.isArray(parsed)) return void 0;
|
|
28
|
+
const out = [];
|
|
29
|
+
for (const item of parsed) {
|
|
30
|
+
if (item && typeof item === "object" && "url" in item) {
|
|
31
|
+
const n = normalizeSocialLinkItem(item);
|
|
32
|
+
if (n) out.push(n);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return out.length ? out : void 0;
|
|
36
|
+
} catch {
|
|
37
|
+
return void 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
chunkUSNT2KNT_cjs.__name(parseSocialLinksJson, "parseSocialLinksJson");
|
|
41
|
+
function mergeEmailLayoutCompanyDetails(branding, emailSettings) {
|
|
42
|
+
const fromBranding = getCompanyDetailsFromSettings(branding);
|
|
43
|
+
const pick = /* @__PURE__ */ chunkUSNT2KNT_cjs.__name((emailVal, fallback) => {
|
|
44
|
+
const t = emailVal?.trim();
|
|
45
|
+
return t || fallback?.trim() || void 0;
|
|
46
|
+
}, "pick");
|
|
47
|
+
const logoUrl = pick(emailSettings.logoUrl ?? emailSettings.emailLogoUrl, fromBranding.logoUrl);
|
|
48
|
+
const companyName = pick(emailSettings.companyName ?? emailSettings.emailCompanyName, fromBranding.companyName);
|
|
49
|
+
const supportEmail = pick(emailSettings.supportEmail ?? emailSettings.emailSupportEmail, fromBranding.supportEmail);
|
|
50
|
+
const supportPhone = pick(emailSettings.supportPhone, void 0);
|
|
51
|
+
const footerDisclaimer = pick(emailSettings.footerDisclaimer, void 0);
|
|
52
|
+
const followUsTitle = pick(emailSettings.followUsTitle, "Follow Us") || "Follow Us";
|
|
53
|
+
const socialFromEmail = parseSocialLinksJson(emailSettings.socialLinks);
|
|
54
|
+
const socialLinks = socialFromEmail?.length ? socialFromEmail : fromBranding.socialLinks;
|
|
55
|
+
return {
|
|
56
|
+
logoUrl,
|
|
57
|
+
companyName,
|
|
58
|
+
supportEmail,
|
|
59
|
+
supportPhone,
|
|
60
|
+
socialLinks,
|
|
61
|
+
footerDisclaimer,
|
|
62
|
+
followUsTitle
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
chunkUSNT2KNT_cjs.__name(mergeEmailLayoutCompanyDetails, "mergeEmailLayoutCompanyDetails");
|
|
66
|
+
function getCompanyDetailsFromSettings(settingsGroup) {
|
|
67
|
+
const logoUrl = settingsGroup.logo ?? settingsGroup.logoUrl ?? "";
|
|
68
|
+
const companyName = settingsGroup.companyName ?? settingsGroup.company_name ?? "";
|
|
69
|
+
const supportEmail = settingsGroup.supportEmail ?? settingsGroup.support_email ?? "";
|
|
70
|
+
let socialLinks = [];
|
|
71
|
+
const raw = settingsGroup.socialLinks ?? settingsGroup.social_links;
|
|
72
|
+
if (typeof raw === "string") {
|
|
73
|
+
try {
|
|
74
|
+
const arr = JSON.parse(raw);
|
|
75
|
+
if (Array.isArray(arr)) {
|
|
76
|
+
for (const item of arr) {
|
|
77
|
+
if (item && typeof item === "object") {
|
|
78
|
+
const n = normalizeSocialLinkItem(item);
|
|
79
|
+
if (n) socialLinks.push(n);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
} catch {
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
logoUrl: logoUrl || void 0,
|
|
88
|
+
companyName: companyName || void 0,
|
|
89
|
+
supportEmail: supportEmail || void 0,
|
|
90
|
+
socialLinks: socialLinks.length ? socialLinks : void 0
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
chunkUSNT2KNT_cjs.__name(getCompanyDetailsFromSettings, "getCompanyDetailsFromSettings");
|
|
94
|
+
|
|
95
|
+
exports.getCompanyDetailsFromSettings = getCompanyDetailsFromSettings;
|
|
96
|
+
exports.mergeEmailLayoutCompanyDetails = mergeEmailLayoutCompanyDetails;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { __name } from './chunk-SHUYVCID.js';
|
|
2
|
+
|
|
3
|
+
// src/plugins/whatsapp/whatsapp-queue.ts
|
|
4
|
+
var WHATSAPP_QUEUE_NAME = "whatsapp";
|
|
5
|
+
function maskPhone(raw) {
|
|
6
|
+
const digits = raw.replace(/\D/g, "");
|
|
7
|
+
if (digits.length <= 4) return "****";
|
|
8
|
+
return `${"*".repeat(Math.max(0, digits.length - 4))}${digits.slice(-4)}`;
|
|
9
|
+
}
|
|
10
|
+
__name(maskPhone, "maskPhone");
|
|
11
|
+
function registerWhatsAppQueueProcessor(cms) {
|
|
12
|
+
const queue = cms.getPlugin("queue");
|
|
13
|
+
const whatsapp = cms.getPlugin("whatsapp");
|
|
14
|
+
if (!queue) {
|
|
15
|
+
console.warn("[whatsapp] queue processor not registered: queue plugin missing");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (!whatsapp || typeof whatsapp.send !== "function") {
|
|
19
|
+
console.warn("[whatsapp] queue processor not registered: whatsapp plugin missing or not configured");
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
queue.registerProcessor(WHATSAPP_QUEUE_NAME, async (data) => {
|
|
23
|
+
const payload = data;
|
|
24
|
+
if (!payload.to) {
|
|
25
|
+
console.warn("[whatsapp] queue job skipped: missing recipient");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
console.log("[whatsapp] queue job processing", {
|
|
29
|
+
to: maskPhone(payload.to),
|
|
30
|
+
templateKey: payload.templateKey ?? null,
|
|
31
|
+
externalTemplateRef: payload.externalTemplateRef ?? null
|
|
32
|
+
});
|
|
33
|
+
try {
|
|
34
|
+
const ok = await whatsapp.send(payload);
|
|
35
|
+
if (ok) {
|
|
36
|
+
console.log("[whatsapp] queue job completed", {
|
|
37
|
+
to: maskPhone(payload.to),
|
|
38
|
+
sent: true
|
|
39
|
+
});
|
|
40
|
+
} else {
|
|
41
|
+
console.warn("[whatsapp] queue job completed without delivery", {
|
|
42
|
+
to: maskPhone(payload.to),
|
|
43
|
+
sent: false
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
} catch (err) {
|
|
47
|
+
console.error("[whatsapp] queue job failed", {
|
|
48
|
+
to: maskPhone(payload.to),
|
|
49
|
+
error: err instanceof Error ? err.message : String(err)
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
console.log("[whatsapp] queue processor registered", {
|
|
54
|
+
queue: WHATSAPP_QUEUE_NAME
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
__name(registerWhatsAppQueueProcessor, "registerWhatsAppQueueProcessor");
|
|
58
|
+
async function queueWhatsApp(cms, payload) {
|
|
59
|
+
const queue = cms.getPlugin("queue");
|
|
60
|
+
if (queue) {
|
|
61
|
+
console.log("[whatsapp] enqueue", {
|
|
62
|
+
to: maskPhone(payload.to),
|
|
63
|
+
templateKey: payload.templateKey ?? null,
|
|
64
|
+
externalTemplateRef: payload.externalTemplateRef ?? null
|
|
65
|
+
});
|
|
66
|
+
await queue.add(WHATSAPP_QUEUE_NAME, payload);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const whatsapp = cms.getPlugin("whatsapp");
|
|
70
|
+
if (whatsapp && typeof whatsapp.send === "function") {
|
|
71
|
+
console.log("[whatsapp] no queue plugin \u2014 sending immediately", {
|
|
72
|
+
to: maskPhone(payload.to)
|
|
73
|
+
});
|
|
74
|
+
return whatsapp.send(payload);
|
|
75
|
+
}
|
|
76
|
+
console.warn("[whatsapp] send skipped: neither queue nor whatsapp plugin available", {
|
|
77
|
+
to: maskPhone(payload.to)
|
|
78
|
+
});
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
__name(queueWhatsApp, "queueWhatsApp");
|
|
82
|
+
|
|
83
|
+
export { queueWhatsApp, registerWhatsAppQueueProcessor };
|