@infuro/cms-core 1.0.69 → 1.0.70

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 (37) hide show
  1. package/dist/admin.cjs +2831 -2680
  2. package/dist/admin.js +1590 -1439
  3. package/dist/api.cjs +41 -41
  4. package/dist/api.js +8 -8
  5. package/dist/auth.cjs +51 -51
  6. package/dist/auth.js +3 -3
  7. package/dist/{chunk-RBKVMHBH.js → chunk-3LF4RYAJ.js} +353 -23
  8. package/dist/{chunk-DBBYLSQP.js → chunk-7NQMGB2S.js} +136 -25
  9. package/dist/{chunk-DWNQTFJ5.js → chunk-CJY2HUJC.js} +19 -19
  10. package/dist/{chunk-SWSTGV4F.cjs → chunk-CKTRA3Q2.cjs} +9 -9
  11. package/dist/{chunk-53AMBXMM.js → chunk-ECUGNV2I.js} +1 -57
  12. package/dist/{chunk-QXAQ3V7R.cjs → chunk-FNLF6G2N.cjs} +7 -7
  13. package/dist/{chunk-T47VP2ZT.js → chunk-HZZTDM5J.js} +2 -2
  14. package/dist/{chunk-3XCTGADT.js → chunk-K6JT7BKY.js} +58 -1
  15. package/dist/{chunk-M5QDJOUP.cjs → chunk-K742UE6S.cjs} +1 -0
  16. package/dist/{chunk-6MM5OMRL.cjs → chunk-KB7EBYPR.cjs} +0 -58
  17. package/dist/{chunk-OXFC3DAM.cjs → chunk-KJB5LBFQ.cjs} +59 -0
  18. package/dist/{chunk-LXWF6T7F.cjs → chunk-LCZZ3S4I.cjs} +19 -19
  19. package/dist/{chunk-HGR4IA7I.cjs → chunk-NIBEGDD4.cjs} +15 -15
  20. package/dist/{chunk-D4LR3S77.js → chunk-NQF6H656.js} +1 -1
  21. package/dist/{chunk-QL44NCZC.cjs → chunk-OP624LWU.cjs} +222 -111
  22. package/dist/{chunk-MJDNS324.js → chunk-SCE2GIKH.js} +2 -2
  23. package/dist/{chunk-747MJJCZ.cjs → chunk-TTOEY7AH.cjs} +404 -74
  24. package/dist/{chunk-WHMIWJL7.js → chunk-W2ZTGLUH.js} +1 -0
  25. package/dist/{emit-order-notification-trigger-X36V4DOH.cjs → emit-order-notification-trigger-I4HQSTEN.cjs} +4 -4
  26. package/dist/{emit-order-notification-trigger-XKN2TWVF.js → emit-order-notification-trigger-TBXAZAPS.js} +2 -2
  27. package/dist/index.cjs +330 -330
  28. package/dist/index.js +13 -13
  29. package/dist/{order-assignees-handlers-JEJ5IDID.cjs → order-assignees-handlers-E6PQZP4H.cjs} +22 -3
  30. package/dist/{order-assignees-handlers-F7WOZHOG.js → order-assignees-handlers-YCT3Q3KC.js} +22 -3
  31. package/dist/{order-completion-otp-handlers-LNAZTMTS.cjs → order-completion-otp-handlers-2ZKRK5SN.cjs} +10 -10
  32. package/dist/{order-completion-otp-handlers-FIW7PZ6W.js → order-completion-otp-handlers-KHLZQQJX.js} +4 -4
  33. package/dist/{order-notification-dispatcher-GG5C4LKZ.cjs → order-notification-dispatcher-37KDVHBM.cjs} +8 -8
  34. package/dist/{order-notification-dispatcher-FS54ANAV.js → order-notification-dispatcher-Z3MXNF4U.js} +3 -3
  35. package/dist/{rbac-debug-db-IRKT6G62.js → rbac-debug-db-JK3U5UZK.js} +1 -1
  36. package/dist/{rbac-debug-db-2ZI3XKA4.cjs → rbac-debug-db-S3D6N6HN.cjs} +2 -2
  37. package/package.json +1 -1
@@ -1,17 +1,17 @@
1
+ import { resolveChatEmailToolSettings, CHAT_EMAIL_LOG, detectChatLeadIntent, parseIntentRecipientEmails, sendChatLeadEmail, buildTranscriptForLeadEmail, buildChatbotSystemPromptWithEmailTool, validateFcmCredentials, sendFcmPushNotification, parseEmailRecipientsFromConfig, isWhatsAppPluginEnabled, WhatsAppService, emailPlugin, initWhatsappTriggerDispatcher } from './chunk-3LF4RYAJ.js';
2
+ import { normalizePhoneE164, generateNumericOtp, createOtpChallenge, verifyAndConsumeOtpChallenge } from './chunk-ECUGNV2I.js';
3
+ import { registerWhatsAppQueueProcessor, queueSms } from './chunk-K6JT7BKY.js';
1
4
  import { inviteStatusForActivation } from './chunk-ZMIMKNSQ.js';
2
- import { normalizePhoneE164, generateNumericOtp, createOtpChallenge, queueSms, verifyAndConsumeOtpChallenge } from './chunk-53AMBXMM.js';
3
5
  import { EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS, EVENT_ORDER_TEMPLATE_KEY, EVENT_ORDER_TEMPLATE_VARIABLES } from './chunk-5NVGWJSY.js';
4
6
  import { JOB_RUNNER_QUEUE } from './chunk-2BNVRFUQ.js';
5
7
  import { validateInventoryForConfirmedOrderLines, orderStatusHoldsStock, reconcileOrderInventoryBetweenSnapshots, orderInventorySnapshotFromRow, validateInventoryForOrderBecomingConfirmed } from './chunk-JYRFSFXH.js';
6
- import { resolveChatEmailToolSettings, CHAT_EMAIL_LOG, detectChatLeadIntent, parseIntentRecipientEmails, sendChatLeadEmail, buildTranscriptForLeadEmail, buildChatbotSystemPromptWithEmailTool, validateFcmCredentials, sendFcmPushNotification, parseEmailRecipientsFromConfig, isWhatsAppPluginEnabled, WhatsAppService, emailPlugin, initWhatsappTriggerDispatcher } from './chunk-RBKVMHBH.js';
7
- import { registerWhatsAppQueueProcessor } from './chunk-3XCTGADT.js';
8
8
  import { queueEmail, queueVendorOnboardEmails, registerEmailQueueProcessor } from './chunk-LJ5C4RBF.js';
9
9
  import { unwrapErpReadData, mapErpPayloadToFulfillment, extractChildOrderRefsFromSalePayload, mapErpPayloadToInvoiceNumber, streamOrderInvoicePdf } from './chunk-PQJIJ4ZX.js';
10
10
  import { isErpIntegrationEnabled } from './chunk-WQZ4AH2P.js';
11
11
  import { mergeEmailLayoutCompanyDetails } from './chunk-YDMHG6BA.js';
12
12
  import { getSmsTemplateDefault, SMS_MESSAGE_TEMPLATE_DEFAULTS } from './chunk-MGT4DJ2D.js';
13
- import { ensureCustomerRecord, linkUnclaimedContactToUser, ensureCustomerForUser, canManageRoles, sessionHasEntityAccess } from './chunk-D4LR3S77.js';
14
- import { permissionRowsToRecord, logRbac, isSuperAdmin, vendorPortalFlagsFromUser, VENDOR_SCOPED_STORE_ENTITIES, isVendorPortalUser, getPermissionableEntityKeys, VENDOR_STORE_RBAC_ENTITIES, isSuperAdminGroupName, VENDOR_RBAC_ENTITIES, VENDOR_VIEWER_ROLE_NAME, DEFAULT_VENDOR_ROLE_DEFS, VENDOR_GROUP_NAME, resolveVendorScopeFromSessionUser, canManageVendorRoles, isPlatformAdministrator, canManageVendorTeam, resolveDisabledMultiVendorScope, logEntityAccessDecision, explainSessionEntityAccess } from './chunk-DWNQTFJ5.js';
13
+ import { ensureCustomerRecord, linkUnclaimedContactToUser, ensureCustomerForUser, canManageRoles, sessionHasEntityAccess } from './chunk-NQF6H656.js';
14
+ import { permissionRowsToRecord, logRbac, isSuperAdmin, vendorPortalFlagsFromUser, VENDOR_SCOPED_STORE_ENTITIES, isVendorPortalUser, getPermissionableEntityKeys, VENDOR_STORE_RBAC_ENTITIES, isSuperAdminGroupName, VENDOR_RBAC_ENTITIES, VENDOR_VIEWER_ROLE_NAME, DEFAULT_VENDOR_ROLE_DEFS, VENDOR_GROUP_NAME, resolveVendorScopeFromSessionUser, canManageVendorRoles, isPlatformAdministrator, canManageVendorTeam, resolveDisabledMultiVendorScope, logEntityAccessDecision, explainSessionEntityAccess } from './chunk-CJY2HUJC.js';
15
15
  import { retireSoftDeletedUniqueValue, activeUniqueValueExists } from './chunk-BK5XW5XH.js';
16
16
  import { queueErp } from './chunk-7QJI56OL.js';
17
17
  import { __name } from './chunk-5BKT4CS5.js';
@@ -1698,6 +1698,82 @@ async function recordOrderAssigneeHistory(dataSource, entityMap, orderId, userId
1698
1698
  return nextSortOrder;
1699
1699
  }
1700
1700
  __name(recordOrderAssigneeHistory, "recordOrderAssigneeHistory");
1701
+ async function validateAssigneeOrderPermission(dataSource, entityMap, userId) {
1702
+ if (!Number.isFinite(userId) || userId <= 0) return {
1703
+ valid: true
1704
+ };
1705
+ if (entityMap.users) {
1706
+ const uRepo = dataSource.getRepository(entityMap.users);
1707
+ const u = await uRepo.findOne({
1708
+ where: {
1709
+ id: userId,
1710
+ deleted: false
1711
+ },
1712
+ relations: [
1713
+ "group"
1714
+ ]
1715
+ });
1716
+ if (!u) {
1717
+ return {
1718
+ valid: false,
1719
+ error: "Assignee user not found."
1720
+ };
1721
+ }
1722
+ const userRow = u;
1723
+ if (userRow.adminAccess) {
1724
+ return {
1725
+ valid: true
1726
+ };
1727
+ }
1728
+ if (userRow.group?.name && userRow.group.name.toLowerCase() === "customer") {
1729
+ return {
1730
+ valid: false,
1731
+ error: "Customer accounts cannot be assigned to orders."
1732
+ };
1733
+ }
1734
+ }
1735
+ if (entityMap.vendor_users) {
1736
+ const vuRepo = dataSource.getRepository(entityMap.vendor_users);
1737
+ const vuLinks = await vuRepo.find({
1738
+ where: {
1739
+ userId
1740
+ },
1741
+ relations: [
1742
+ "vendorRole",
1743
+ "vendorRole.permissions"
1744
+ ]
1745
+ });
1746
+ if (vuLinks && vuLinks.length > 0) {
1747
+ let anyRoleHasAccess = false;
1748
+ for (const vu of vuLinks) {
1749
+ const r = vu.vendorRole;
1750
+ if (r) {
1751
+ if (r.isOwnerRole) {
1752
+ anyRoleHasAccess = true;
1753
+ break;
1754
+ }
1755
+ if (Array.isArray(r.permissions)) {
1756
+ const orderPerm = r.permissions.find((p) => String(p?.entity).toLowerCase() === "orders");
1757
+ if (orderPerm && orderPerm.canRead) {
1758
+ anyRoleHasAccess = true;
1759
+ break;
1760
+ }
1761
+ }
1762
+ }
1763
+ }
1764
+ if (!anyRoleHasAccess) {
1765
+ return {
1766
+ valid: false,
1767
+ error: "Cannot assign order: This team member does not have permission to access orders. Please grant order access in Roles & Permissions."
1768
+ };
1769
+ }
1770
+ }
1771
+ }
1772
+ return {
1773
+ valid: true
1774
+ };
1775
+ }
1776
+ __name(validateAssigneeOrderPermission, "validateAssigneeOrderPermission");
1701
1777
  var LIST_QUERY_RESERVED = /* @__PURE__ */ new Set([
1702
1778
  "page",
1703
1779
  "limit",
@@ -5112,6 +5188,16 @@ function createCrudHandler(dataSource, entityMap, options) {
5112
5188
  persistBody.orderNumber = `ORD00${randomPart}`;
5113
5189
  persistBody.qrToken = crypto2.randomBytes(16).toString("hex");
5114
5190
  }
5191
+ if (resource === "orders" && persistBody.assignedUserId) {
5192
+ const assignCheck = await validateAssigneeOrderPermission(dataSource, entityMap, Number(persistBody.assignedUserId));
5193
+ if (!assignCheck.valid) {
5194
+ return json({
5195
+ error: assignCheck.error ?? "Invalid order assignee"
5196
+ }, {
5197
+ status: 400
5198
+ });
5199
+ }
5200
+ }
5115
5201
  await retireSoftDeletedUniquesFromBody(repo, persistBody);
5116
5202
  created = await repo.save(repo.create(persistBody));
5117
5203
  if (resource === "orders") {
@@ -5313,7 +5399,7 @@ function createCrudHandler(dataSource, entityMap, options) {
5313
5399
  const orderIdForNotify = created.id;
5314
5400
  const finalCreatedStatus = String(created.status ?? createdStatus ?? "pending").toLowerCase();
5315
5401
  const initialPayStatus = String(persistBody.paymentStatus ?? body.paymentStatus ?? "unpaid").toLowerCase();
5316
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
5402
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
5317
5403
  if (finalCreatedStatus === "pending") {
5318
5404
  if (initialPayStatus === "failed") {
5319
5405
  fireOrderNotificationTrigger("payment_failed", orderIdForNotify, {
@@ -6220,6 +6306,14 @@ function createCrudByIdHandler(dataSource, entityMap, options) {
6220
6306
  if ("assignedUserId" in rawBody && rawBody.assignedUserId !== void 0) {
6221
6307
  const aId = Number(rawBody.assignedUserId);
6222
6308
  if (Number.isFinite(aId) && aId > 0) {
6309
+ const assignCheck = await validateAssigneeOrderPermission(dataSource, entityMap, aId);
6310
+ if (!assignCheck.valid) {
6311
+ return json({
6312
+ error: assignCheck.error ?? "Invalid order assignee"
6313
+ }, {
6314
+ status: 400
6315
+ });
6316
+ }
6223
6317
  if (scopePutEarly.type === "vendor" && entityMap.vendor_users) {
6224
6318
  const vuRepo = dataSource.getRepository(entityMap.vendor_users);
6225
6319
  const vuLink = await vuRepo.findOne({
@@ -6516,7 +6610,7 @@ function createCrudByIdHandler(dataSource, entityMap, options) {
6516
6610
  const paymentUpdated = Boolean(rawBody && typeof rawBody === "object" && rawBody.paymentStatus != null);
6517
6611
  const assigneeUpdated = Boolean(rawBody && typeof rawBody === "object" && "assignedUserId" in rawBody && rawBody.assignedUserId !== void 0 && Number(rawBody.assignedUserId) > 0 && Number(rawBody.assignedUserId) !== Number(existingOrderRow?.assignedUserId));
6518
6612
  if (assigneeUpdated) {
6519
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
6613
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
6520
6614
  fireOrderNotificationTrigger("order_assigned", updatedOrder.id, {
6521
6615
  dataSource,
6522
6616
  entityMap
@@ -6533,7 +6627,7 @@ function createCrudByIdHandler(dataSource, entityMap, options) {
6533
6627
  const payments = Array.isArray(updatedOrder.payments) ? updatedOrder.payments : [];
6534
6628
  const bodyPayStatus = rawBody && typeof rawBody === "object" && rawBody.paymentStatus != null ? String(rawBody.paymentStatus).toLowerCase() : null;
6535
6629
  const curPayStatus = bodyPayStatus || String(payments[0]?.status || "unpaid").toLowerCase();
6536
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
6630
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
6537
6631
  if (newStatus === "pending") {
6538
6632
  if (curPayStatus === "failed") {
6539
6633
  fireOrderNotificationTrigger("payment_failed", updatedOrder.id, {
@@ -7101,6 +7195,14 @@ function createCrudByIdHandler(dataSource, entityMap, options) {
7101
7195
  const aId = Number(rawBody.assignedUserId);
7102
7196
  console.log("[ORDERS-DEBUG][UPDATE] Updating assignedUserId to:", aId);
7103
7197
  if (Number.isFinite(aId) && aId > 0) {
7198
+ const assignCheck = await validateAssigneeOrderPermission(dataSource, entityMap, aId);
7199
+ if (!assignCheck.valid) {
7200
+ return json({
7201
+ error: assignCheck.error ?? "Invalid order assignee"
7202
+ }, {
7203
+ status: 400
7204
+ });
7205
+ }
7104
7206
  if (scopePut.type === "vendor" && entityMap.vendor_users) {
7105
7207
  const vuRepo = dataSource.getRepository(entityMap.vendor_users);
7106
7208
  const vuLink = await vuRepo.findOne({
@@ -7241,7 +7343,7 @@ function createCrudByIdHandler(dataSource, entityMap, options) {
7241
7343
  });
7242
7344
  }
7243
7345
  if (ordStatus === "pending" || ordStatus === "confirmed") {
7244
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
7346
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
7245
7347
  fireOrderNotificationTrigger("order_placed", pOrder, {
7246
7348
  dataSource,
7247
7349
  entityMap
@@ -7255,7 +7357,7 @@ function createCrudByIdHandler(dataSource, entityMap, options) {
7255
7357
  }
7256
7358
  }
7257
7359
  } else if (newPayStatus === "failed") {
7258
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
7360
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
7259
7361
  fireOrderNotificationTrigger("payment_failed", pOrder, {
7260
7362
  dataSource,
7261
7363
  entityMap
@@ -7263,7 +7365,7 @@ function createCrudByIdHandler(dataSource, entityMap, options) {
7263
7365
  }).catch(() => {
7264
7366
  });
7265
7367
  } else if (newPayStatus === "refunded") {
7266
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
7368
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
7267
7369
  fireOrderNotificationTrigger("payment_refund_initiated", pOrder, {
7268
7370
  dataSource,
7269
7371
  entityMap
@@ -7390,7 +7492,7 @@ function createCrudByIdHandler(dataSource, entityMap, options) {
7390
7492
  const paymentUpdated = Boolean(rawBody && typeof rawBody === "object" && rawBody.paymentStatus != null);
7391
7493
  const assigneeUpdated = Boolean(rawBody && typeof rawBody === "object" && "assignedUserId" in rawBody && rawBody.assignedUserId !== void 0 && Number(rawBody.assignedUserId) > 0 && Number(rawBody.assignedUserId) !== Number(existingOrderRow?.assignedUserId));
7392
7494
  if (assigneeUpdated) {
7393
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
7495
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
7394
7496
  fireOrderNotificationTrigger("order_assigned", ord.id, {
7395
7497
  dataSource,
7396
7498
  entityMap
@@ -7407,7 +7509,7 @@ function createCrudByIdHandler(dataSource, entityMap, options) {
7407
7509
  const payments = Array.isArray(ord.payments) ? ord.payments : [];
7408
7510
  const bodyPayStatus = rawBody && typeof rawBody === "object" && rawBody.paymentStatus != null ? String(rawBody.paymentStatus).toLowerCase() : null;
7409
7511
  const curPayStatus = bodyPayStatus || String(payments[0]?.status || "unpaid").toLowerCase();
7410
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
7512
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
7411
7513
  if (newStatus === "pending") {
7412
7514
  if (curPayStatus === "failed") {
7413
7515
  fireOrderNotificationTrigger("payment_failed", ord.id, {
@@ -29036,6 +29138,7 @@ function whatsappPlugin(config = {}) {
29036
29138
  const { getWhatsAppSettings, getMessageTemplateRow, ...staticRest } = config;
29037
29139
  let settingsLoader = getWhatsAppSettings;
29038
29140
  if (!settingsLoader && context.dataSource) {
29141
+ const encKey = resolveSettingsEncryptionKey(env);
29039
29142
  settingsLoader = /* @__PURE__ */ __name(async () => {
29040
29143
  try {
29041
29144
  const ds = context.dataSource;
@@ -29046,10 +29149,18 @@ function whatsappPlugin(config = {}) {
29046
29149
  deleted: false
29047
29150
  }
29048
29151
  });
29049
- return Object.fromEntries(rows.map((r) => [
29050
- r.key,
29051
- r.value
29052
- ]));
29152
+ const result = {};
29153
+ for (const r of rows) {
29154
+ let val = String(r.value ?? "");
29155
+ if (r.encrypted && encKey) {
29156
+ try {
29157
+ val = simpleDecrypt(val, encKey);
29158
+ } catch {
29159
+ }
29160
+ }
29161
+ result[r.key] = val;
29162
+ }
29163
+ return result;
29053
29164
  } catch {
29054
29165
  return {};
29055
29166
  }
@@ -31238,7 +31349,7 @@ function createCmsApiHandler(config) {
31238
31349
  status: 400
31239
31350
  });
31240
31351
  }
31241
- const { resendOrderNotification } = await import('./order-notification-dispatcher-FS54ANAV.js');
31352
+ const { resendOrderNotification } = await import('./order-notification-dispatcher-Z3MXNF4U.js');
31242
31353
  const result = await resendOrderNotification(triggerKey, orderId, {
31243
31354
  dataSource,
31244
31355
  entityMap,
@@ -31337,7 +31448,7 @@ function createCmsApiHandler(config) {
31337
31448
  status: "cancelled"
31338
31449
  });
31339
31450
  const fireOrderCancelledNotification = /* @__PURE__ */ __name((refundAmount) => {
31340
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
31451
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
31341
31452
  fireOrderNotificationTrigger("order_cancelled", orderId, {
31342
31453
  dataSource,
31343
31454
  entityMap
@@ -31582,7 +31693,7 @@ function createCmsApiHandler(config) {
31582
31693
  }, {
31583
31694
  status: 400
31584
31695
  });
31585
- const { createOrderCompletionOtpHandlers } = await import('./order-completion-otp-handlers-FIW7PZ6W.js');
31696
+ const { createOrderCompletionOtpHandlers } = await import('./order-completion-otp-handlers-KHLZQQJX.js');
31586
31697
  const handlers = createOrderCompletionOtpHandlers(dataSource, entityMap, getCms, getHydratedSessionUser);
31587
31698
  return handlers.getChannels(req, orderId);
31588
31699
  }
@@ -31597,7 +31708,7 @@ function createCmsApiHandler(config) {
31597
31708
  }, {
31598
31709
  status: 400
31599
31710
  });
31600
- const { createOrderCompletionOtpHandlers } = await import('./order-completion-otp-handlers-FIW7PZ6W.js');
31711
+ const { createOrderCompletionOtpHandlers } = await import('./order-completion-otp-handlers-KHLZQQJX.js');
31601
31712
  const handlers = createOrderCompletionOtpHandlers(dataSource, entityMap, getCms, getHydratedSessionUser);
31602
31713
  return handlers.sendOtp(req, orderId);
31603
31714
  }
@@ -31612,7 +31723,7 @@ function createCmsApiHandler(config) {
31612
31723
  }, {
31613
31724
  status: 400
31614
31725
  });
31615
- const { createOrderCompletionOtpHandlers } = await import('./order-completion-otp-handlers-FIW7PZ6W.js');
31726
+ const { createOrderCompletionOtpHandlers } = await import('./order-completion-otp-handlers-KHLZQQJX.js');
31616
31727
  const handlers = createOrderCompletionOtpHandlers(dataSource, entityMap, getCms, getHydratedSessionUser);
31617
31728
  return handlers.verifyOtp(req, orderId);
31618
31729
  }
@@ -31627,7 +31738,7 @@ function createCmsApiHandler(config) {
31627
31738
  }, {
31628
31739
  status: 400
31629
31740
  });
31630
- const { createOrderAssigneesHandlers } = await import('./order-assignees-handlers-F7WOZHOG.js');
31741
+ const { createOrderAssigneesHandlers } = await import('./order-assignees-handlers-YCT3Q3KC.js');
31631
31742
  const handlers = createOrderAssigneesHandlers(dataSource, entityMap, getHydratedSessionUser);
31632
31743
  return handlers.listEligibleAssignees(req, orderId);
31633
31744
  }
@@ -32244,7 +32355,7 @@ function createStorefrontApiHandler(config) {
32244
32355
  const otpPepper = config.otpPepper;
32245
32356
  const defaultPhoneCc = config.defaultPhoneCountryCode;
32246
32357
  function fireStorefrontCheckoutNotifications(orderId) {
32247
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
32358
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
32248
32359
  fireOrderNotificationTrigger("order_pending", orderId, {
32249
32360
  dataSource,
32250
32361
  entityMap
@@ -35189,7 +35300,7 @@ function createStorefrontApiHandler(config) {
35189
35300
  } catch {
35190
35301
  }
35191
35302
  try {
35192
- void import('./emit-order-notification-trigger-XKN2TWVF.js').then(({ fireOrderNotificationTrigger }) => {
35303
+ void import('./emit-order-notification-trigger-TBXAZAPS.js').then(({ fireOrderNotificationTrigger }) => {
35193
35304
  fireOrderNotificationTrigger("order_cancelled", orderId, {
35194
35305
  dataSource,
35195
35306
  entityMap
@@ -70,24 +70,6 @@ function hasEntityPermission(record, entity, action) {
70
70
  }
71
71
  __name(hasEntityPermission, "hasEntityPermission");
72
72
 
73
- // src/auth/role-helpers.ts
74
- var SUPER_ADMIN_GROUP_ID = 1;
75
- var VENDOR_ADMIN_GROUP_ID = 5;
76
- function isSuperAdmin(user) {
77
- if (!user) return false;
78
- if (user.groupId === SUPER_ADMIN_GROUP_ID) return true;
79
- if (user.isRBACAdmin === true) return true;
80
- return isSuperAdminGroupName(user.groupName);
81
- }
82
- __name(isSuperAdmin, "isSuperAdmin");
83
- function isVendorAdmin(user) {
84
- if (!user?.email || isSuperAdmin(user)) return false;
85
- if (user.groupId === VENDOR_ADMIN_GROUP_ID) return true;
86
- if ((user.vendorIds?.length ?? 0) > 0) return true;
87
- return isVendorGroupName(user.groupName);
88
- }
89
- __name(isVendorAdmin, "isVendorAdmin");
90
-
91
73
  // src/auth/vendor-scope.ts
92
74
  var DEFAULT_VENDOR_SLUG = "default";
93
75
  async function resolveDefaultVendorId(dataSource) {
@@ -231,6 +213,24 @@ function vendorPortalFlagsFromUser(input) {
231
213
  }
232
214
  __name(vendorPortalFlagsFromUser, "vendorPortalFlagsFromUser");
233
215
 
216
+ // src/auth/role-helpers.ts
217
+ var SUPER_ADMIN_GROUP_ID = 1;
218
+ var VENDOR_ADMIN_GROUP_ID = 5;
219
+ function isSuperAdmin(user) {
220
+ if (!user) return false;
221
+ if (user.groupId === SUPER_ADMIN_GROUP_ID) return true;
222
+ if (user.isRBACAdmin === true) return true;
223
+ return isSuperAdminGroupName(user.groupName);
224
+ }
225
+ __name(isSuperAdmin, "isSuperAdmin");
226
+ function isVendorAdmin(user) {
227
+ if (!user?.email || isSuperAdmin(user)) return false;
228
+ if (user.groupId === VENDOR_ADMIN_GROUP_ID) return true;
229
+ if ((user.vendorIds?.length ?? 0) > 0) return true;
230
+ return isVendorGroupName(user.groupName);
231
+ }
232
+ __name(isVendorAdmin, "isVendorAdmin");
233
+
234
234
  // src/lib/vendor-role-defaults.ts
235
235
  var VENDOR_RBAC_ENTITIES = [
236
236
  ...VENDOR_STORE_RBAC_ENTITIES,
@@ -623,7 +623,7 @@ async function logEntityAccessDecision(dataSource, context, user, entity, action
623
623
  const id = Number(user.id);
624
624
  if (Number.isFinite(id)) {
625
625
  try {
626
- const { loadDbPermissionsForUser } = await import('./rbac-debug-db-IRKT6G62.js');
626
+ const { loadDbPermissionsForUser } = await import('./rbac-debug-db-JK3U5UZK.js');
627
627
  dbPermissions = await loadDbPermissionsForUser(dataSource, id);
628
628
  } catch (e) {
629
629
  dbPermissions = {
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkQXAQ3V7R_cjs = require('./chunk-QXAQ3V7R.cjs');
4
- var chunkLXWF6T7F_cjs = require('./chunk-LXWF6T7F.cjs');
3
+ var chunkFNLF6G2N_cjs = require('./chunk-FNLF6G2N.cjs');
4
+ var chunkLCZZ3S4I_cjs = require('./chunk-LCZZ3S4I.cjs');
5
5
  var chunk4WZNRVEZ_cjs = require('./chunk-4WZNRVEZ.cjs');
6
6
  var chunkCTTV375J_cjs = require('./chunk-CTTV375J.cjs');
7
7
  var chunkXHPRD45G_cjs = require('./chunk-XHPRD45G.cjs');
@@ -15,12 +15,12 @@ var _GoogleProvider__default = /*#__PURE__*/_interopDefault(_GoogleProvider);
15
15
 
16
16
  // src/auth/seed-permissions.ts
17
17
  async function seedAdministratorPermissions(dataSource, entityMap) {
18
- const entities = chunkLXWF6T7F_cjs.getPermissionableEntityKeys(entityMap);
18
+ const entities = chunkLCZZ3S4I_cjs.getPermissionableEntityKeys(entityMap);
19
19
  const groupRepo = dataSource.getRepository(entityMap.user_groups);
20
20
  const permRepo = dataSource.getRepository(entityMap.permissions);
21
21
  const adminGroup = await groupRepo.findOne({
22
22
  where: {
23
- name: chunkLXWF6T7F_cjs.ADMIN_GROUP_NAME,
23
+ name: chunkLCZZ3S4I_cjs.ADMIN_GROUP_NAME,
24
24
  deleted: false
25
25
  }
26
26
  });
@@ -260,13 +260,13 @@ async function createCustomerUserFromGoogleOAuth(input) {
260
260
  }
261
261
  if (input.entityMap.contacts) {
262
262
  try {
263
- await chunkQXAQ3V7R_cjs.linkUnclaimedContactToUser(input.dataSource, input.entityMap.contacts, userId, email);
263
+ await chunkFNLF6G2N_cjs.linkUnclaimedContactToUser(input.dataSource, input.entityMap.contacts, userId, email);
264
264
  } catch {
265
265
  }
266
266
  }
267
267
  if (input.entityMap.customer) {
268
268
  try {
269
- await chunkQXAQ3V7R_cjs.ensureCustomerForUser(input.dataSource, input.entityMap.customer, {
269
+ await chunkFNLF6G2N_cjs.ensureCustomerForUser(input.dataSource, input.entityMap.customer, {
270
270
  id: userId,
271
271
  name: displayName,
272
272
  email,
@@ -387,18 +387,18 @@ async function checkMultiVendorEnabledViaSettingsApi() {
387
387
  chunkXHPRD45G_cjs.__name(checkMultiVendorEnabledViaSettingsApi, "checkMultiVendorEnabledViaSettingsApi");
388
388
  function sessionUserFromNextAuthUser(user) {
389
389
  const g = user.group;
390
- const isRBACAdmin = chunkLXWF6T7F_cjs.isSuperAdmin({
390
+ const isRBACAdmin = chunkLCZZ3S4I_cjs.isSuperAdmin({
391
391
  groupId: user.groupId ?? void 0,
392
392
  groupName: g?.name,
393
393
  isRBACAdmin: false
394
394
  });
395
- const entityPerms = chunkLXWF6T7F_cjs.permissionRowsToRecord(g?.permissions);
395
+ const entityPerms = chunkLCZZ3S4I_cjs.permissionRowsToRecord(g?.permissions);
396
396
  const rawAdminAccess = user.adminAccess;
397
397
  const adminAccess = rawAdminAccess === true ? true : rawAdminAccess === false ? false : void 0;
398
398
  const vendorIds = user.vendorIds ?? [];
399
399
  const vendorRole = user.vendorRole ?? null;
400
400
  const isVendorRoleOwner = user.isVendorRoleOwner ?? false;
401
- const { isVendorPortal, isVendorOwner: isVendorOwner2 } = chunkLXWF6T7F_cjs.vendorPortalFlagsFromUser({
401
+ const { isVendorPortal, isVendorOwner: isVendorOwner2 } = chunkLCZZ3S4I_cjs.vendorPortalFlagsFromUser({
402
402
  email: user.email,
403
403
  isRBACAdmin,
404
404
  groupName: g?.name,
@@ -2,62 +2,6 @@ import { __name } from './chunk-5BKT4CS5.js';
2
2
  import { createHmac, timingSafeEqual, randomInt } from 'crypto';
3
3
  import { MoreThan, IsNull } from 'typeorm';
4
4
 
5
- // src/plugins/sms/sms-queue.ts
6
- var SMS_QUEUE_NAME = "sms";
7
- function registerSmsQueueProcessor(cms) {
8
- const queue = cms.getPlugin("queue");
9
- const sms = cms.getPlugin("sms");
10
- if (!queue || !sms || typeof sms.send !== "function") return;
11
- queue.registerProcessor(SMS_QUEUE_NAME, async (data) => {
12
- const payload = data;
13
- if (!payload.to) return;
14
- if (payload.templateKey?.trim()) {
15
- await sms.send({
16
- to: payload.to,
17
- templateKey: payload.templateKey.trim(),
18
- variables: payload.variables,
19
- otpCode: payload.otpCode
20
- });
21
- return;
22
- }
23
- if (!payload.body?.trim()) return;
24
- await sms.send({
25
- to: payload.to,
26
- body: payload.body,
27
- otpCode: payload.otpCode,
28
- variables: payload.variables
29
- });
30
- });
31
- }
32
- __name(registerSmsQueueProcessor, "registerSmsQueueProcessor");
33
- async function queueSms(cms, payload) {
34
- const queue = cms.getPlugin("queue");
35
- const sms = cms.getPlugin("sms");
36
- if (queue) {
37
- await queue.add(SMS_QUEUE_NAME, payload);
38
- return;
39
- }
40
- if (sms && typeof sms.send === "function") {
41
- if (payload.templateKey?.trim()) {
42
- await sms.send({
43
- to: payload.to,
44
- templateKey: payload.templateKey.trim(),
45
- variables: payload.variables,
46
- otpCode: payload.otpCode
47
- });
48
- return;
49
- }
50
- if (payload.body?.trim()) {
51
- await sms.send({
52
- to: payload.to,
53
- body: payload.body,
54
- otpCode: payload.otpCode,
55
- variables: payload.variables
56
- });
57
- }
58
- }
59
- }
60
- __name(queueSms, "queueSms");
61
5
  var OTP_TTL_MS = 10 * 60 * 1e3;
62
6
  var MAX_SENDS_PER_HOUR = 5;
63
7
  var MAX_VERIFY_ATTEMPTS = 8;
@@ -196,4 +140,4 @@ async function verifyAndConsumeOtpChallenge(dataSource, entityMap, input) {
196
140
  }
197
141
  __name(verifyAndConsumeOtpChallenge, "verifyAndConsumeOtpChallenge");
198
142
 
199
- export { countRecentOtpSends, createOtpChallenge, generateNumericOtp, hashOtpCode, normalizePhoneE164, queueSms, registerSmsQueueProcessor, verifyAndConsumeOtpChallenge, verifyOtpCodeHash };
143
+ export { countRecentOtpSends, createOtpChallenge, generateNumericOtp, hashOtpCode, normalizePhoneE164, verifyAndConsumeOtpChallenge, verifyOtpCodeHash };
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkLXWF6T7F_cjs = require('./chunk-LXWF6T7F.cjs');
3
+ var chunkLCZZ3S4I_cjs = require('./chunk-LCZZ3S4I.cjs');
4
4
  var chunkXHPRD45G_cjs = require('./chunk-XHPRD45G.cjs');
5
5
  var typeorm = require('typeorm');
6
6
 
@@ -273,7 +273,7 @@ var RBAC_ADMIN_ONLY_ENTITIES = /* @__PURE__ */ new Set([
273
273
  "permissions"
274
274
  ]);
275
275
  function sessionHasEntityAccess(user, entity, action) {
276
- return chunkLXWF6T7F_cjs.explainSessionEntityAccess(user, entity, action).allowed;
276
+ return chunkLCZZ3S4I_cjs.explainSessionEntityAccess(user, entity, action).allowed;
277
277
  }
278
278
  chunkXHPRD45G_cjs.__name(sessionHasEntityAccess, "sessionHasEntityAccess");
279
279
  function canManageRoles(user) {
@@ -364,8 +364,8 @@ function createAuthHelpersFromGetSession(getSession, NextResponse) {
364
364
  }
365
365
  const u = session.user;
366
366
  const allowed = sessionHasEntityAccess(u, entity, action);
367
- const { reason } = chunkLXWF6T7F_cjs.explainSessionEntityAccess(u, entity, action);
368
- chunkLXWF6T7F_cjs.logRbac("authHelpers.requireEntityPermission", {
367
+ const { reason } = chunkLCZZ3S4I_cjs.explainSessionEntityAccess(u, entity, action);
368
+ chunkLCZZ3S4I_cjs.logRbac("authHelpers.requireEntityPermission", {
369
369
  entity,
370
370
  action,
371
371
  allowed,
@@ -397,10 +397,10 @@ function createAuthHelpersFromGetSession(getSession, NextResponse) {
397
397
  }
398
398
  const u = session.user;
399
399
  if (u.isRBACAdmin) return null;
400
- if (chunkLXWF6T7F_cjs.isVendorPortalUser(u)) return null;
400
+ if (chunkLCZZ3S4I_cjs.isVendorPortalUser(u)) return null;
401
401
  if (u.adminAccess === true) return null;
402
402
  if (u.adminAccess === false) {
403
- chunkLXWF6T7F_cjs.logRbac("requireAdminAccess denied (adminAccess:false)", {
403
+ chunkLCZZ3S4I_cjs.logRbac("requireAdminAccess denied (adminAccess:false)", {
404
404
  email: u.email,
405
405
  groupName: u.groupName,
406
406
  isVendorPortal: u.isVendorPortal
@@ -412,7 +412,7 @@ function createAuthHelpersFromGetSession(getSession, NextResponse) {
412
412
  status: 403
413
413
  });
414
414
  }
415
- chunkLXWF6T7F_cjs.logRbac("requireAdminAccess denied (no matching rule)", {
415
+ chunkLCZZ3S4I_cjs.logRbac("requireAdminAccess denied (no matching rule)", {
416
416
  email: u.email,
417
417
  adminAccess: u.adminAccess,
418
418
  groupName: u.groupName,
@@ -1,4 +1,4 @@
1
- import { notifyLog, notificationTriggerEmitter, maskNotifyPhone } from './chunk-WHMIWJL7.js';
1
+ import { notifyLog, notificationTriggerEmitter, maskNotifyPhone } from './chunk-W2ZTGLUH.js';
2
2
  import { __name } from './chunk-5BKT4CS5.js';
3
3
 
4
4
  // src/lib/emit-order-notification-trigger.ts
@@ -94,7 +94,7 @@ async function emitOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
94
94
  orderId
95
95
  });
96
96
  try {
97
- const { dispatchOrderNotificationDirectly } = await import('./order-notification-dispatcher-FS54ANAV.js');
97
+ const { dispatchOrderNotificationDirectly } = await import('./order-notification-dispatcher-Z3MXNF4U.js');
98
98
  await dispatchOrderNotificationDirectly(triggerKey, triggerPayload, deps.dataSource, deps.entityMap);
99
99
  } catch (err) {
100
100
  notifyLog.error("TRIGGER", "direct dispatch failed", {
@@ -1,5 +1,62 @@
1
1
  import { __name } from './chunk-5BKT4CS5.js';
2
2
 
3
+ // src/plugins/sms/sms-queue.ts
4
+ var SMS_QUEUE_NAME = "sms";
5
+ function registerSmsQueueProcessor(cms) {
6
+ const queue = cms.getPlugin("queue");
7
+ const sms = cms.getPlugin("sms");
8
+ if (!queue || !sms || typeof sms.send !== "function") return;
9
+ queue.registerProcessor(SMS_QUEUE_NAME, async (data) => {
10
+ const payload = data;
11
+ if (!payload.to) return;
12
+ if (payload.templateKey?.trim()) {
13
+ await sms.send({
14
+ to: payload.to,
15
+ templateKey: payload.templateKey.trim(),
16
+ variables: payload.variables,
17
+ otpCode: payload.otpCode
18
+ });
19
+ return;
20
+ }
21
+ if (!payload.body?.trim()) return;
22
+ await sms.send({
23
+ to: payload.to,
24
+ body: payload.body,
25
+ otpCode: payload.otpCode,
26
+ variables: payload.variables
27
+ });
28
+ });
29
+ }
30
+ __name(registerSmsQueueProcessor, "registerSmsQueueProcessor");
31
+ async function queueSms(cms, payload) {
32
+ const queue = cms.getPlugin("queue");
33
+ const sms = cms.getPlugin("sms");
34
+ if (queue) {
35
+ await queue.add(SMS_QUEUE_NAME, payload);
36
+ return;
37
+ }
38
+ if (sms && typeof sms.send === "function") {
39
+ if (payload.templateKey?.trim()) {
40
+ await sms.send({
41
+ to: payload.to,
42
+ templateKey: payload.templateKey.trim(),
43
+ variables: payload.variables,
44
+ otpCode: payload.otpCode
45
+ });
46
+ return;
47
+ }
48
+ if (payload.body?.trim()) {
49
+ await sms.send({
50
+ to: payload.to,
51
+ body: payload.body,
52
+ otpCode: payload.otpCode,
53
+ variables: payload.variables
54
+ });
55
+ }
56
+ }
57
+ }
58
+ __name(queueSms, "queueSms");
59
+
3
60
  // src/plugins/whatsapp/whatsapp-queue.ts
4
61
  var WHATSAPP_QUEUE_NAME = "whatsapp";
5
62
  function maskPhone(raw) {
@@ -80,4 +137,4 @@ async function queueWhatsApp(cms, payload) {
80
137
  }
81
138
  __name(queueWhatsApp, "queueWhatsApp");
82
139
 
83
- export { queueWhatsApp, registerWhatsAppQueueProcessor };
140
+ export { queueSms, queueWhatsApp, registerSmsQueueProcessor, registerWhatsAppQueueProcessor };
@@ -65,6 +65,7 @@ var notifyLog = {
65
65
  trigger: /* @__PURE__ */ chunkXHPRD45G_cjs.__name((message, data) => write("info", "TRIGGER", message, data), "trigger"),
66
66
  email: /* @__PURE__ */ chunkXHPRD45G_cjs.__name((message, data) => write("info", "EMAIL", message, data), "email"),
67
67
  whatsapp: /* @__PURE__ */ chunkXHPRD45G_cjs.__name((message, data) => write("info", "WHATSAPP", message, data), "whatsapp"),
68
+ sms: /* @__PURE__ */ chunkXHPRD45G_cjs.__name((message, data) => write("info", "SMS", message, data), "sms"),
68
69
  push: /* @__PURE__ */ chunkXHPRD45G_cjs.__name((message, data) => write("info", "PUSH", message, data), "push"),
69
70
  skip: /* @__PURE__ */ chunkXHPRD45G_cjs.__name((channel, message, data) => write("warn", `SKIP ${channel}`, message, data), "skip"),
70
71
  error: /* @__PURE__ */ chunkXHPRD45G_cjs.__name((channel, message, data) => write("error", channel, message, data), "error")