@infuro/cms-core 1.0.34 → 1.0.36

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 (152) hide show
  1. package/README.md +13 -0
  2. package/dist/OrderTrackPage-W3J6WIG2.js +426 -0
  3. package/dist/OrderTrackPage-Z6FCJQYY.cjs +428 -0
  4. package/dist/admin.cjs +35254 -21613
  5. package/dist/admin.d.cts +192 -9
  6. package/dist/admin.d.ts +192 -9
  7. package/dist/admin.js +34301 -20755
  8. package/dist/api.cjs +137 -17531
  9. package/dist/api.d.cts +633 -3
  10. package/dist/api.d.ts +633 -3
  11. package/dist/api.js +15 -17528
  12. package/dist/auth.cjs +192 -1034
  13. package/dist/auth.d.cts +197 -54
  14. package/dist/auth.d.ts +197 -54
  15. package/dist/auth.js +4 -966
  16. package/dist/chunk-2AEVFOQP.cjs +30436 -0
  17. package/dist/chunk-3DZRIZOD.cjs +52 -0
  18. package/dist/chunk-5ELSW2UP.js +150 -0
  19. package/dist/chunk-7NMT3GBR.cjs +29 -0
  20. package/dist/chunk-COBORIJH.cjs +2373 -0
  21. package/dist/chunk-CRFV5WJK.js +16 -0
  22. package/dist/chunk-D5FBNKQM.cjs +104 -0
  23. package/dist/chunk-FG6I64HP.js +604 -0
  24. package/dist/chunk-GO7PPYNU.js +76 -0
  25. package/dist/chunk-HCIRL37O.js +21 -0
  26. package/dist/chunk-HF3L2GIT.cjs +194 -0
  27. package/dist/chunk-HT5DI3XW.cjs +82 -0
  28. package/dist/chunk-JC6DLWTE.js +21 -0
  29. package/dist/chunk-JS2W7XZ4.js +30312 -0
  30. package/dist/chunk-JXF23MPG.js +25 -0
  31. package/dist/chunk-KFFB6EMZ.js +123 -0
  32. package/dist/chunk-KPKFNLQQ.cjs +648 -0
  33. package/dist/chunk-LI2IXVAY.js +171 -0
  34. package/dist/chunk-MQBT33IV.js +48 -0
  35. package/dist/chunk-OOTLNH63.cjs +18 -0
  36. package/dist/chunk-PNOKNSG2.cjs +222 -0
  37. package/dist/chunk-SHUYVCID.js +4 -0
  38. package/dist/chunk-SPQFNIYJ.cjs +132 -0
  39. package/dist/chunk-SYBOCAWB.js +97 -0
  40. package/dist/chunk-TDV6EJHV.js +192 -0
  41. package/dist/chunk-UCKN4BBY.cjs +24 -0
  42. package/dist/chunk-UF3BYUXY.js +616 -0
  43. package/dist/chunk-UPLVMVRX.cjs +23 -0
  44. package/dist/chunk-USNT2KNT.cjs +6 -0
  45. package/dist/chunk-VMY2S32H.js +2342 -0
  46. package/dist/chunk-WEMDMVHQ.js +216 -0
  47. package/dist/chunk-WO2DW4AU.cjs +182 -0
  48. package/dist/chunk-X47PBV4I.js +79 -0
  49. package/dist/chunk-X6H5VBQ2.cjs +620 -0
  50. package/dist/chunk-XQ3QUHWR.cjs +83 -0
  51. package/dist/chunk-XW5ATPRW.cjs +155 -0
  52. package/dist/cli.cjs +107 -86
  53. package/dist/cli.js +66 -29
  54. package/dist/email-queue-CGZBVVAS.js +2 -0
  55. package/dist/email-queue-TPZWLTIV.cjs +23 -0
  56. package/dist/emit-order-notification-trigger-D2N3KFHL.cjs +16 -0
  57. package/dist/emit-order-notification-trigger-IVLWKKJL.js +3 -0
  58. package/dist/erp-config-enabled-CUMQ6N2V.cjs +11 -0
  59. package/dist/erp-config-enabled-T37X7T34.js +2 -0
  60. package/dist/erp-order-invoice-3YISSOWW.js +3 -0
  61. package/dist/erp-order-invoice-ZR5F2KTA.cjs +12 -0
  62. package/dist/event-order-defaults-EMWBIGL3.cjs +39 -0
  63. package/dist/event-order-defaults-SDRNAZHC.js +2 -0
  64. package/dist/hooks.cjs +259 -132
  65. package/dist/hooks.d.cts +42 -1
  66. package/dist/hooks.d.ts +42 -1
  67. package/dist/hooks.js +234 -91
  68. package/dist/index.cjs +3679 -22356
  69. package/dist/index.d.cts +2173 -643
  70. package/dist/index.d.ts +2173 -643
  71. package/dist/index.js +2587 -22119
  72. package/dist/interpolate-WAKPN56R.cjs +11 -0
  73. package/dist/interpolate-WDUWDF3I.js +2 -0
  74. package/dist/migrations/1779400000000-ConvertStatusToEnum.ts +142 -0
  75. package/dist/migrations/1779400000000-SeedDefaultCurrencies.ts +33 -0
  76. package/dist/migrations/1779500000000-VendorRolesAndPermissions.ts +102 -0
  77. package/dist/migrations/1779600000000-VendorRegistrationProfile.ts +52 -0
  78. package/dist/migrations/1779700000000-CollectionIsCatalog.ts +22 -0
  79. package/dist/migrations/1779710000000-CollectionPlatformCatalog.ts +60 -0
  80. package/dist/migrations/1779720000000-ProductCategoryPlatformCatalog.ts +157 -0
  81. package/dist/migrations/1779800000000-EventsAndEventProducts.ts +173 -0
  82. package/dist/migrations/1779810000000-BackfillVendorRoleEventsPermissions.ts +38 -0
  83. package/dist/migrations/1779820000000-FixProductsCategoryForeignKey.ts +70 -0
  84. package/dist/migrations/1779830000000-ProductTitleColumn.ts +32 -0
  85. package/dist/migrations/1779840000000-EventAboutAndVisibilityFields.ts +34 -0
  86. package/dist/migrations/1779850000000-EventCityCountrySplit.ts +43 -0
  87. package/dist/migrations/1779860000000-CreateCombos.ts +140 -0
  88. package/dist/migrations/1780100000000-OrderAttendeesEventId.ts +55 -0
  89. package/dist/migrations/1780110000000-EventContactFormId.ts +49 -0
  90. package/dist/migrations/1780130000000-ProductVariants.ts +54 -0
  91. package/dist/migrations/1780140000000-EventManagementEnhancements.ts +44 -0
  92. package/dist/migrations/1780160000000-EventRegistrationGstProductContactForm.ts +79 -0
  93. package/dist/migrations/1780170000000-ComboCurrencyPrices.ts +20 -0
  94. package/dist/migrations/1781110000000-VendorOwnerCombosPermission.ts +38 -0
  95. package/dist/migrations/1781120000000-RefundPoliciesAndRequests.ts +225 -0
  96. package/dist/migrations/1781130000000-CreateAttendees.ts +44 -0
  97. package/dist/migrations/1781140000000-EventOrderNotifications.ts +29 -0
  98. package/dist/migrations/1781150000000-EventNamedLists.ts +28 -0
  99. package/dist/migrations/1781160000000-RefundPolicyEventTiers.ts +27 -0
  100. package/dist/migrations/1781170000000-EventRefundPolicy.ts +42 -0
  101. package/dist/migrations/1781180000000-RemoveCartItemsUniqueConstraint.ts +15 -0
  102. package/dist/migrations/1781190000000-RenameProductTaxesToProductConfig.ts +84 -0
  103. package/dist/migrations/1781200000000-VendorOwnerProductConfigPermissions.ts +51 -0
  104. package/dist/migrations/1781210000000-VendorRoleProductConfigPermissions.ts +46 -0
  105. package/dist/migrations/1781220000000-AddWhatsappTriggerBindings.ts +23 -0
  106. package/dist/migrations/1781230000000-AddOrderNotificationTriggers.ts +46 -0
  107. package/dist/migrations/1781240000000-DropEventOrderNotificationColumns.ts +29 -0
  108. package/dist/migrations/1781250000000-RemoveOrderRefundedTrigger.ts +36 -0
  109. package/dist/migrations/helpers/vendor-role-seed.ts +243 -0
  110. package/dist/paid-order-erp-3USEG6WL.js +3 -0
  111. package/dist/paid-order-erp-FSQ3GSXE.cjs +12 -0
  112. package/dist/pg-boss-service-4XF2TQ2E.js +2 -0
  113. package/dist/pg-boss-service-L6MTF4EQ.cjs +15 -0
  114. package/dist/razorpay-KLO2KNCB.js +49 -0
  115. package/dist/razorpay-U23LGY72.cjs +56 -0
  116. package/dist/rbac-debug-db-HWP65A4O.cjs +35 -0
  117. package/dist/rbac-debug-db-QJH3AD34.js +33 -0
  118. package/dist/sms-defaults-2NL24H57.js +2 -0
  119. package/dist/sms-defaults-KCOPKQBA.cjs +19 -0
  120. package/dist/stripe-4FD27QVJ.js +51 -0
  121. package/dist/stripe-VU6OEG2D.cjs +57 -0
  122. package/dist/theme.cjs +31 -59
  123. package/dist/theme.d.cts +78 -3
  124. package/dist/theme.d.ts +78 -3
  125. package/dist/theme.js +23 -20
  126. package/dist/vendor-invite-status-77O7ZQ3U.cjs +19 -0
  127. package/dist/vendor-invite-status-PWJ3DE76.js +2 -0
  128. package/dist/whatsapp-trigger-dispatcher-ONHXI7UY.cjs +19 -0
  129. package/dist/whatsapp-trigger-dispatcher-PWFI4FKP.js +6 -0
  130. package/package.json +147 -142
  131. package/dist/admin.cjs.map +0 -1
  132. package/dist/admin.js.map +0 -1
  133. package/dist/api.cjs.map +0 -1
  134. package/dist/api.js.map +0 -1
  135. package/dist/auth.cjs.map +0 -1
  136. package/dist/auth.js.map +0 -1
  137. package/dist/cli.cjs.map +0 -1
  138. package/dist/cli.js.map +0 -1
  139. package/dist/config-DJ5CmQvS.d.cts +0 -8
  140. package/dist/config-DJ5CmQvS.d.ts +0 -8
  141. package/dist/hooks.cjs.map +0 -1
  142. package/dist/hooks.js.map +0 -1
  143. package/dist/index-Bf5GO8fu.d.cts +0 -583
  144. package/dist/index-DOiJuMQA.d.ts +0 -583
  145. package/dist/index.cjs.map +0 -1
  146. package/dist/index.js.map +0 -1
  147. package/dist/theme.cjs.map +0 -1
  148. package/dist/theme.js.map +0 -1
  149. package/dist/types-DCVaXlPV.d.cts +0 -78
  150. package/dist/types-DCVaXlPV.d.ts +0 -78
  151. package/dist/vendor-scope-DTYhJk_I.d.cts +0 -129
  152. package/dist/vendor-scope-DTYhJk_I.d.ts +0 -129
@@ -0,0 +1,216 @@
1
+ import { isErpIntegrationEnabled } from './chunk-JC6DLWTE.js';
2
+ import { __name } from './chunk-SHUYVCID.js';
3
+
4
+ // src/plugins/erp/erp-response-map.ts
5
+ function pickString(o, keys) {
6
+ for (const k of keys) {
7
+ const v = o[k];
8
+ if (typeof v === "string" && v.trim()) return v.trim();
9
+ }
10
+ return void 0;
11
+ }
12
+ __name(pickString, "pickString");
13
+ function unwrapErpReadData(json) {
14
+ if (!json || typeof json !== "object") return null;
15
+ const o = json;
16
+ const d = o.data;
17
+ if (d && typeof d === "object" && !Array.isArray(d)) return d;
18
+ return o;
19
+ }
20
+ __name(unwrapErpReadData, "unwrapErpReadData");
21
+ function firstObject(data, keys) {
22
+ for (const k of keys) {
23
+ const v = data[k];
24
+ if (v && typeof v === "object" && !Array.isArray(v)) return v;
25
+ }
26
+ return null;
27
+ }
28
+ __name(firstObject, "firstObject");
29
+ function extractEvents(src) {
30
+ const timeline = src.timeline ?? src.events ?? src.history ?? src.trackingEvents;
31
+ if (!Array.isArray(timeline) || !timeline.length) return void 0;
32
+ const events = [];
33
+ for (const row of timeline) {
34
+ if (!row || typeof row !== "object") continue;
35
+ const r = row;
36
+ const at = pickString(r, [
37
+ "at",
38
+ "timestamp",
39
+ "date",
40
+ "occurredAt"
41
+ ]) ?? (r.at instanceof Date ? r.at.toISOString() : void 0);
42
+ const label = pickString(r, [
43
+ "label",
44
+ "status",
45
+ "title",
46
+ "message",
47
+ "description"
48
+ ]);
49
+ const detail = pickString(r, [
50
+ "detail",
51
+ "notes",
52
+ "description"
53
+ ]);
54
+ if (at || label || detail) events.push({
55
+ at,
56
+ label,
57
+ detail
58
+ });
59
+ }
60
+ return events.length ? events : void 0;
61
+ }
62
+ __name(extractEvents, "extractEvents");
63
+ function mapErpPayloadToFulfillment(data) {
64
+ const nested = firstObject(data, [
65
+ "fulfillment",
66
+ "packaging",
67
+ "shipment",
68
+ "shipping",
69
+ "delivery"
70
+ ]);
71
+ const src = nested || data;
72
+ const status = pickString(src, [
73
+ "status",
74
+ "fulfillmentStatus",
75
+ "state",
76
+ "label",
77
+ "packagingStatus"
78
+ ]);
79
+ const trackingId = pickString(src, [
80
+ "trackingId",
81
+ "tracking_id",
82
+ "trackingNumber",
83
+ "awb",
84
+ "trackingUrl"
85
+ ]);
86
+ const events = extractEvents(src);
87
+ if (!status && !trackingId && !(events && events.length)) return void 0;
88
+ return {
89
+ status,
90
+ trackingId,
91
+ events
92
+ };
93
+ }
94
+ __name(mapErpPayloadToFulfillment, "mapErpPayloadToFulfillment");
95
+ function mapErpPayloadToInvoiceNumber(data) {
96
+ const nested = firstObject(data, [
97
+ "invoice",
98
+ "latestInvoice",
99
+ "postedInvoice"
100
+ ]);
101
+ const src = nested || data;
102
+ return pickString(src, [
103
+ "invoiceNumber",
104
+ "invoice_number",
105
+ "number",
106
+ "name",
107
+ "id"
108
+ ]);
109
+ }
110
+ __name(mapErpPayloadToInvoiceNumber, "mapErpPayloadToInvoiceNumber");
111
+ function extractChildOrderRefsFromSalePayload(data) {
112
+ const lists = [
113
+ data.returns,
114
+ data.returnOrders,
115
+ data.relatedReturns,
116
+ data.childOrders,
117
+ data.children
118
+ ];
119
+ const seen = /* @__PURE__ */ new Set();
120
+ const out = [];
121
+ for (const list of lists) {
122
+ if (!Array.isArray(list)) continue;
123
+ for (const item of list) {
124
+ if (!item || typeof item !== "object") continue;
125
+ const o = item;
126
+ const ref = pickString(o, [
127
+ "platformReturnId",
128
+ "platform_return_id",
129
+ "refId",
130
+ "ref_id"
131
+ ]) ?? (typeof o.id === "string" ? o.id : void 0);
132
+ if (!ref || seen.has(ref)) continue;
133
+ seen.add(ref);
134
+ const t = (pickString(o, [
135
+ "kind",
136
+ "type",
137
+ "orderKind"
138
+ ]) || "").toLowerCase();
139
+ const orderKind = /replac/.test(t) ? "replacement" : "return";
140
+ out.push({
141
+ ref,
142
+ orderKind
143
+ });
144
+ }
145
+ }
146
+ return out;
147
+ }
148
+ __name(extractChildOrderRefsFromSalePayload, "extractChildOrderRefsFromSalePayload");
149
+
150
+ // src/plugins/erp/erp-order-invoice.ts
151
+ function pickInvoiceId(data) {
152
+ const nested = data.invoice && typeof data.invoice === "object" && !Array.isArray(data.invoice) ? data.invoice : null;
153
+ const src = nested || data;
154
+ for (const k of [
155
+ "invoiceId",
156
+ "invoice_id",
157
+ "id"
158
+ ]) {
159
+ const v = src[k];
160
+ if (typeof v === "string" && v.trim()) return v.trim();
161
+ }
162
+ return void 0;
163
+ }
164
+ __name(pickInvoiceId, "pickInvoiceId");
165
+ async function streamOrderInvoicePdf(cms, dataSource, entityMap, orderId, options) {
166
+ const jsonErr = /* @__PURE__ */ __name((msg, status) => new Response(JSON.stringify({
167
+ error: msg
168
+ }), {
169
+ status,
170
+ headers: {
171
+ "Content-Type": "application/json"
172
+ }
173
+ }), "jsonErr");
174
+ const on = await isErpIntegrationEnabled(cms, dataSource, entityMap);
175
+ if (!on) return jsonErr("Invoice not available", 503);
176
+ const erp = cms.getPlugin("erp");
177
+ if (!erp?.submission) return jsonErr("Invoice not available", 503);
178
+ const orderRepo = dataSource.getRepository(entityMap.orders);
179
+ const order = await orderRepo.findOne({
180
+ where: {
181
+ id: orderId,
182
+ deleted: false
183
+ }
184
+ });
185
+ if (!order) return jsonErr("Not found", 404);
186
+ const kind = order.orderKind || "sale";
187
+ if (kind !== "sale") return jsonErr("Invoice only for sale orders", 400);
188
+ if (options.ownerContactId != null && order.contactId !== options.ownerContactId) {
189
+ return jsonErr("Not found", 404);
190
+ }
191
+ const meta = order.metadata && typeof order.metadata === "object" && !Array.isArray(order.metadata) ? order.metadata : {};
192
+ const inv = meta.invoice && typeof meta.invoice === "object" && !Array.isArray(meta.invoice) ? meta.invoice : {};
193
+ let invoiceId = typeof inv.invoiceId === "string" ? inv.invoiceId.trim() : "";
194
+ if (!invoiceId) {
195
+ const refId = String(order.orderNumber || "");
196
+ const r = await erp.submission.postErpReadAction("get-invoice", {
197
+ platformOrderId: refId
198
+ });
199
+ const d = r.ok ? unwrapErpReadData(r.json) : null;
200
+ invoiceId = d ? pickInvoiceId(d) || "" : "";
201
+ }
202
+ if (!invoiceId) return jsonErr("Invoice not ready", 404);
203
+ const pdf = await erp.submission.fetchInvoicePdf(invoiceId);
204
+ if (!pdf.ok || !pdf.buffer) return jsonErr(pdf.error || "PDF fetch failed", 502);
205
+ const filename = `invoice-${orderId}.pdf`;
206
+ return new Response(pdf.buffer, {
207
+ status: 200,
208
+ headers: {
209
+ "Content-Type": pdf.contentType || "application/pdf",
210
+ "Content-Disposition": `attachment; filename="${filename}"`
211
+ }
212
+ });
213
+ }
214
+ __name(streamOrderInvoicePdf, "streamOrderInvoicePdf");
215
+
216
+ export { extractChildOrderRefsFromSalePayload, mapErpPayloadToFulfillment, mapErpPayloadToInvoiceNumber, streamOrderInvoicePdf, unwrapErpReadData };
@@ -0,0 +1,182 @@
1
+ 'use strict';
2
+
3
+ var chunkKPKFNLQQ_cjs = require('./chunk-KPKFNLQQ.cjs');
4
+ var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
5
+
6
+ // src/auth/helpers.ts
7
+ var RBAC_ADMIN_ONLY_ENTITIES = /* @__PURE__ */ new Set([
8
+ "users",
9
+ "user_groups",
10
+ "permissions"
11
+ ]);
12
+ function sessionHasEntityAccess(user, entity, action) {
13
+ return chunkKPKFNLQQ_cjs.explainSessionEntityAccess(user, entity, action).allowed;
14
+ }
15
+ chunkUSNT2KNT_cjs.__name(sessionHasEntityAccess, "sessionHasEntityAccess");
16
+ function canManageRoles(user) {
17
+ return !!(user?.email && user.isRBACAdmin);
18
+ }
19
+ chunkUSNT2KNT_cjs.__name(canManageRoles, "canManageRoles");
20
+ var OPEN_ENDPOINTS = [
21
+ {
22
+ "/api/contacts": [
23
+ "POST"
24
+ ]
25
+ },
26
+ {
27
+ "/api/form-submissions": [
28
+ "POST"
29
+ ]
30
+ },
31
+ {
32
+ "/api/blogs": [
33
+ "GET"
34
+ ]
35
+ }
36
+ ];
37
+ var PERMISSION_REQUIRED_ENDPOINTS = {};
38
+ function isOpenEndpoint(pathname) {
39
+ return OPEN_ENDPOINTS.some((endpoint) => pathname.startsWith(Object.keys(endpoint)[0]));
40
+ }
41
+ chunkUSNT2KNT_cjs.__name(isOpenEndpoint, "isOpenEndpoint");
42
+ function getRequiredPermission(pathname) {
43
+ return null;
44
+ }
45
+ chunkUSNT2KNT_cjs.__name(getRequiredPermission, "getRequiredPermission");
46
+ function isPublicMethod(pathname, method) {
47
+ for (const endpoint of OPEN_ENDPOINTS) {
48
+ const key = Object.keys(endpoint)[0];
49
+ if (pathname.startsWith(key) && endpoint[key].includes(method)) return true;
50
+ }
51
+ return false;
52
+ }
53
+ chunkUSNT2KNT_cjs.__name(isPublicMethod, "isPublicMethod");
54
+ function createAuthHelpers(getSession, NextResponse) {
55
+ return createAuthHelpersFromGetSession(getSession, NextResponse);
56
+ }
57
+ chunkUSNT2KNT_cjs.__name(createAuthHelpers, "createAuthHelpers");
58
+ function createCmsAuthBundle(getSession, NextResponse) {
59
+ const auth = createAuthHelpers(getSession, NextResponse);
60
+ return {
61
+ requireAuth: auth.requireAuth,
62
+ requireAdminAccess: auth.requireAdminAccess,
63
+ requireEntityPermission: auth.requireEntityPermission,
64
+ getSessionUser: auth.getAuthenticatedUser,
65
+ getAuthenticatedUser: auth.getAuthenticatedUser
66
+ };
67
+ }
68
+ chunkUSNT2KNT_cjs.__name(createCmsAuthBundle, "createCmsAuthBundle");
69
+ function createAuthHelpersFromGetSession(getSession, NextResponse) {
70
+ return {
71
+ async requireAuth() {
72
+ const session = await getSession();
73
+ if (!session?.user?.email) {
74
+ return NextResponse.json({
75
+ error: "Unauthorized"
76
+ }, {
77
+ status: 401
78
+ });
79
+ }
80
+ return null;
81
+ },
82
+ async requirePermission() {
83
+ const session = await getSession();
84
+ if (!session?.user?.email) {
85
+ return NextResponse.json({
86
+ error: "Unauthorized"
87
+ }, {
88
+ status: 401
89
+ });
90
+ }
91
+ return null;
92
+ },
93
+ async requireEntityPermission(_req, entity, action) {
94
+ const session = await getSession();
95
+ if (!session?.user?.email) {
96
+ return NextResponse.json({
97
+ error: "Unauthorized"
98
+ }, {
99
+ status: 401
100
+ });
101
+ }
102
+ const u = session.user;
103
+ const allowed = sessionHasEntityAccess(u, entity, action);
104
+ const { reason } = chunkKPKFNLQQ_cjs.explainSessionEntityAccess(u, entity, action);
105
+ chunkKPKFNLQQ_cjs.logRbac("authHelpers.requireEntityPermission", {
106
+ entity,
107
+ action,
108
+ allowed,
109
+ reason,
110
+ email: u.email,
111
+ groupName: u.groupName,
112
+ vendorIds: u.vendorIds,
113
+ isVendorPortal: u.isVendorPortal,
114
+ isVendorOwner: u.isVendorOwner
115
+ });
116
+ if (allowed) return null;
117
+ return NextResponse.json({
118
+ error: "Forbidden",
119
+ entity,
120
+ action,
121
+ reason
122
+ }, {
123
+ status: 403
124
+ });
125
+ },
126
+ async requireAdminAccess() {
127
+ const session = await getSession();
128
+ if (!session?.user?.email) {
129
+ return NextResponse.json({
130
+ error: "Unauthorized"
131
+ }, {
132
+ status: 401
133
+ });
134
+ }
135
+ const u = session.user;
136
+ if (u.isRBACAdmin) return null;
137
+ if (chunkKPKFNLQQ_cjs.isVendorPortalUser(u)) return null;
138
+ if (u.adminAccess === true) return null;
139
+ if (u.adminAccess === false) {
140
+ chunkKPKFNLQQ_cjs.logRbac("requireAdminAccess denied (adminAccess:false)", {
141
+ email: u.email,
142
+ groupName: u.groupName,
143
+ isVendorPortal: u.isVendorPortal
144
+ });
145
+ return NextResponse.json({
146
+ error: "Forbidden",
147
+ reason: "admin_access"
148
+ }, {
149
+ status: 403
150
+ });
151
+ }
152
+ chunkKPKFNLQQ_cjs.logRbac("requireAdminAccess denied (no matching rule)", {
153
+ email: u.email,
154
+ adminAccess: u.adminAccess,
155
+ groupName: u.groupName,
156
+ isVendorPortal: u.isVendorPortal
157
+ });
158
+ return NextResponse.json({
159
+ error: "Forbidden",
160
+ reason: "admin_access"
161
+ }, {
162
+ status: 403
163
+ });
164
+ },
165
+ async getAuthenticatedUser() {
166
+ const session = await getSession();
167
+ return session?.user ?? null;
168
+ }
169
+ };
170
+ }
171
+ chunkUSNT2KNT_cjs.__name(createAuthHelpersFromGetSession, "createAuthHelpersFromGetSession");
172
+
173
+ exports.OPEN_ENDPOINTS = OPEN_ENDPOINTS;
174
+ exports.PERMISSION_REQUIRED_ENDPOINTS = PERMISSION_REQUIRED_ENDPOINTS;
175
+ exports.RBAC_ADMIN_ONLY_ENTITIES = RBAC_ADMIN_ONLY_ENTITIES;
176
+ exports.canManageRoles = canManageRoles;
177
+ exports.createAuthHelpers = createAuthHelpers;
178
+ exports.createCmsAuthBundle = createCmsAuthBundle;
179
+ exports.getRequiredPermission = getRequiredPermission;
180
+ exports.isOpenEndpoint = isOpenEndpoint;
181
+ exports.isPublicMethod = isPublicMethod;
182
+ exports.sessionHasEntityAccess = sessionHasEntityAccess;
@@ -0,0 +1,79 @@
1
+ import { notificationTriggerEmitter } from './chunk-HCIRL37O.js';
2
+ import { __name } from './chunk-SHUYVCID.js';
3
+
4
+ // src/lib/emit-order-notification-trigger.ts
5
+ function maskPhone(raw) {
6
+ const digits = String(raw ?? "").replace(/\D/g, "");
7
+ if (digits.length <= 4) return "(none)";
8
+ return `***${digits.slice(-4)}`;
9
+ }
10
+ __name(maskPhone, "maskPhone");
11
+ async function emitOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
12
+ if (!deps.entityMap.orders) {
13
+ console.warn("[notification-triggers] skip emit: orders entity missing from entityMap", {
14
+ triggerKey,
15
+ orderId
16
+ });
17
+ return;
18
+ }
19
+ const listenerCount = notificationTriggerEmitter.listenerCount("__any__");
20
+ if (listenerCount === 0) {
21
+ console.warn("[notification-triggers] no WhatsApp dispatcher listener \u2014 ensure createCmsApiHandler passes getCms (initWhatsappTriggerDispatcher)");
22
+ }
23
+ const orderRepo = deps.dataSource.getRepository(deps.entityMap.orders);
24
+ const fullOrder = await orderRepo.findOne({
25
+ where: {
26
+ id: orderId,
27
+ deleted: false
28
+ },
29
+ relations: [
30
+ "contact"
31
+ ]
32
+ });
33
+ if (!fullOrder) {
34
+ console.warn("[notification-triggers] skip emit: order not found", {
35
+ triggerKey,
36
+ orderId
37
+ });
38
+ return;
39
+ }
40
+ const fo = fullOrder;
41
+ const phone = fo.contact?.phone ?? null;
42
+ console.log("[notification-triggers] emit", {
43
+ triggerKey,
44
+ orderId,
45
+ orderNumber: fo.orderNumber ?? null,
46
+ phone: maskPhone(phone),
47
+ listeners: listenerCount
48
+ });
49
+ if (!phone?.trim()) {
50
+ console.warn("[notification-triggers] order contact has no phone \u2014 WhatsApp will be skipped", {
51
+ orderId
52
+ });
53
+ }
54
+ notificationTriggerEmitter.emitTrigger(triggerKey, {
55
+ orderId,
56
+ orderNumber: String(fo.orderNumber ?? ""),
57
+ customerName: fo.contact?.name ?? "",
58
+ customerPhone: phone,
59
+ total: fo.total ?? 0,
60
+ currency: String(fo.currency ?? "INR"),
61
+ vendorId: fo.vendorId ?? null,
62
+ ...extra?.refundAmount != null ? {
63
+ refundAmount: extra.refundAmount
64
+ } : {}
65
+ });
66
+ }
67
+ __name(emitOrderNotificationTrigger, "emitOrderNotificationTrigger");
68
+ function fireOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
69
+ console.log("[notification-triggers] fire", {
70
+ triggerKey,
71
+ orderId
72
+ });
73
+ void emitOrderNotificationTrigger(triggerKey, orderId, deps, extra).catch((err) => {
74
+ console.error("[notification-triggers]", triggerKey, orderId, err);
75
+ });
76
+ }
77
+ __name(fireOrderNotificationTrigger, "fireOrderNotificationTrigger");
78
+
79
+ export { emitOrderNotificationTrigger, fireOrderNotificationTrigger };