@infuro/cms-core 1.0.36 → 1.0.38

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 (29) hide show
  1. package/dist/admin.cjs +459 -496
  2. package/dist/admin.js +459 -496
  3. package/dist/api.cjs +36 -36
  4. package/dist/api.js +4 -4
  5. package/dist/auth.cjs +51 -51
  6. package/dist/auth.js +3 -3
  7. package/dist/{chunk-COBORIJH.cjs → chunk-22FFHLTO.cjs} +39 -56
  8. package/dist/{chunk-X6H5VBQ2.cjs → chunk-E6WVP7BK.cjs} +6 -6
  9. package/dist/{chunk-VMY2S32H.js → chunk-NNQBWDCI.js} +39 -56
  10. package/dist/{chunk-WO2DW4AU.cjs → chunk-OIGCAGH7.cjs} +7 -7
  11. package/dist/{chunk-UF3BYUXY.js → chunk-P7QCLE5W.js} +4 -3
  12. package/dist/{chunk-JS2W7XZ4.js → chunk-PYUXVU75.js} +243 -23
  13. package/dist/{chunk-FG6I64HP.js → chunk-SBRBR3VO.js} +1 -1
  14. package/dist/{chunk-LI2IXVAY.js → chunk-UXMDSNIG.js} +1 -1
  15. package/dist/{chunk-2AEVFOQP.cjs → chunk-VJDUKAJ3.cjs} +310 -90
  16. package/dist/{chunk-KPKFNLQQ.cjs → chunk-WMXPKKXU.cjs} +4 -3
  17. package/dist/index.cjs +260 -260
  18. package/dist/index.d.cts +12 -5
  19. package/dist/index.d.ts +12 -5
  20. package/dist/index.js +8 -8
  21. package/dist/migrations/1775500000000-RssFeedsAndArticles.ts +0 -1
  22. package/dist/migrations/1775700000000-JobSchedules.ts +0 -1
  23. package/dist/migrations/1781260000000-RenameWhatsappTriggerBindingsToOrderNotificationBindings.ts +92 -0
  24. package/dist/migrations/1781270000000-ComboVendorId.ts +58 -0
  25. package/dist/{whatsapp-trigger-dispatcher-ONHXI7UY.cjs → order-notification-dispatcher-RU7BTGGX.cjs} +3 -4
  26. package/dist/{whatsapp-trigger-dispatcher-PWFI4FKP.js → order-notification-dispatcher-XWIJYDGA.js} +1 -2
  27. package/dist/{rbac-debug-db-HWP65A4O.cjs → rbac-debug-db-KHG4FJC3.cjs} +2 -2
  28. package/dist/{rbac-debug-db-QJH3AD34.js → rbac-debug-db-QWHOENBR.js} +1 -1
  29. package/package.json +1 -1
@@ -3,7 +3,6 @@
3
3
  var chunkUCKN4BBY_cjs = require('./chunk-UCKN4BBY.cjs');
4
4
  var chunkXW5ATPRW_cjs = require('./chunk-XW5ATPRW.cjs');
5
5
  var chunkOOTLNH63_cjs = require('./chunk-OOTLNH63.cjs');
6
- var chunkSPQFNIYJ_cjs = require('./chunk-SPQFNIYJ.cjs');
7
6
  var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
8
7
  var clientSes = require('@aws-sdk/client-ses');
9
8
  var nodemailer = require('nodemailer');
@@ -440,9 +439,9 @@ var WhatsAppService = class {
440
439
  let body = opts.body?.trim() ?? "";
441
440
  const variables = opts.variables ?? {};
442
441
  if (opts.templateKey?.trim() && this.getMessageTemplateRow) {
443
- const { resolveEventOrderTemplate: resolveEventOrderTemplate2, EVENT_ORDER_TEMPLATE_KEY } = await import('./event-order-defaults-EMWBIGL3.cjs');
442
+ const { resolveEventOrderTemplate, EVENT_ORDER_TEMPLATE_KEY } = await import('./event-order-defaults-EMWBIGL3.cjs');
444
443
  if (opts.templateKey.trim() === EVENT_ORDER_TEMPLATE_KEY) {
445
- const resolved = await resolveEventOrderTemplate2("whatsapp", async (ch, key) => {
444
+ const resolved = await resolveEventOrderTemplate("whatsapp", async (ch, key) => {
446
445
  const row = await this.getMessageTemplateRow(ch, key);
447
446
  if (!row) return null;
448
447
  return {
@@ -2040,7 +2039,7 @@ function emailPlugin(config) {
2040
2039
  }
2041
2040
  chunkUSNT2KNT_cjs.__name(emailPlugin, "emailPlugin");
2042
2041
 
2043
- // src/lib/whatsapp-trigger-dispatcher.ts
2042
+ // src/lib/order-notification-dispatcher.ts
2044
2043
  var initialized = false;
2045
2044
  function maskPhone3(raw) {
2046
2045
  const digits = String(raw ?? "").replace(/\D/g, "");
@@ -2094,48 +2093,52 @@ async function isTriggerCatalogEnabled(triggerKey, dataSource, entityMap) {
2094
2093
  }
2095
2094
  }
2096
2095
  chunkUSNT2KNT_cjs.__name(isTriggerCatalogEnabled, "isTriggerCatalogEnabled");
2097
- async function loadBoundWhatsAppTemplate(triggerKey, dataSource, entityMap) {
2098
- if (!entityMap.whatsapp_trigger_bindings || !entityMap.message_templates) {
2099
- console.warn("[order-notifications] bindings or message_templates missing from entityMap");
2096
+ async function loadBoundTemplate(triggerKey, channel, dataSource, entityMap) {
2097
+ if (!entityMap.order_notification_bindings || !entityMap.message_templates) {
2098
+ console.warn("[order-notifications] order_notification_bindings or message_templates missing from entityMap");
2100
2099
  return null;
2101
2100
  }
2102
- const binding = await dataSource.getRepository(entityMap.whatsapp_trigger_bindings).findOne({
2101
+ const binding = await dataSource.getRepository(entityMap.order_notification_bindings).findOne({
2103
2102
  where: {
2104
2103
  triggerKey,
2104
+ channel,
2105
2105
  enabled: true
2106
2106
  }
2107
2107
  });
2108
2108
  if (!binding) {
2109
- console.warn("[order-notifications] no whatsapp_trigger_bindings row", {
2110
- triggerKey
2109
+ console.warn("[order-notifications] no order_notification_bindings row", {
2110
+ triggerKey,
2111
+ channel
2111
2112
  });
2112
2113
  return null;
2113
2114
  }
2114
2115
  const templateId = binding.messageTemplateId;
2115
2116
  if (templateId == null) {
2116
2117
  console.warn("[order-notifications] binding exists but no template selected", {
2117
- triggerKey
2118
+ triggerKey,
2119
+ channel
2118
2120
  });
2119
2121
  return null;
2120
2122
  }
2121
2123
  const template = await dataSource.getRepository(entityMap.message_templates).findOne({
2122
2124
  where: {
2123
2125
  id: templateId,
2124
- channel: "whatsapp",
2126
+ channel,
2125
2127
  deleted: false,
2126
2128
  enabled: true
2127
2129
  }
2128
2130
  });
2129
2131
  if (!template) {
2130
- console.warn("[order-notifications] bound WhatsApp template not found or disabled", {
2132
+ console.warn("[order-notifications] bound template not found or disabled", {
2131
2133
  triggerKey,
2134
+ channel,
2132
2135
  templateId
2133
2136
  });
2134
2137
  return null;
2135
2138
  }
2136
2139
  return template;
2137
2140
  }
2138
- chunkUSNT2KNT_cjs.__name(loadBoundWhatsAppTemplate, "loadBoundWhatsAppTemplate");
2141
+ chunkUSNT2KNT_cjs.__name(loadBoundTemplate, "loadBoundTemplate");
2139
2142
  function mergeTriggerVariables(payload, rich) {
2140
2143
  const basic = {
2141
2144
  orderId: String(payload.orderId ?? ""),
@@ -2156,43 +2159,16 @@ function mergeTriggerVariables(payload, rich) {
2156
2159
  };
2157
2160
  }
2158
2161
  chunkUSNT2KNT_cjs.__name(mergeTriggerVariables, "mergeTriggerVariables");
2159
- async function sendOrderPlacedEmail(orderId, dataSource, entityMap, getCms, variables, contactEmail) {
2160
- if (!entityMap.message_templates) return;
2161
- const templateRepo = dataSource.getRepository(entityMap.message_templates);
2162
- const getTemplateRow = /* @__PURE__ */ chunkUSNT2KNT_cjs.__name(async (channel, templateKey) => {
2163
- const row = await templateRepo.findOne({
2164
- where: {
2165
- channel,
2166
- templateKey,
2167
- deleted: false
2168
- }
2169
- });
2170
- if (!row) return null;
2171
- const r = row;
2172
- return {
2173
- subject: r.subject,
2174
- body: r.body,
2175
- externalTemplateRef: r.externalTemplateRef,
2176
- name: r.name,
2177
- language: r.providerMeta?.language ?? null,
2178
- paramOrder: r.providerMeta?.paramOrder ?? null,
2179
- enabled: r.enabled
2180
- };
2181
- }, "getTemplateRow");
2182
- const resolved = await chunkSPQFNIYJ_cjs.resolveEventOrderTemplate("email", getTemplateRow, null);
2183
- if (!resolved?.enabled) {
2184
- console.warn("[order-notifications] email template disabled or missing for order_placed", {
2185
- orderId
2186
- });
2187
- return;
2188
- }
2162
+ async function sendEmailForTrigger(triggerKey, orderId, variables, contactEmail, dataSource, entityMap, getCms) {
2163
+ const template = await loadBoundTemplate(triggerKey, "email", dataSource, entityMap);
2164
+ if (!template) return;
2189
2165
  const [branding, emailSettings] = await Promise.all([
2190
2166
  getSettingsGroup(dataSource, entityMap, "branding"),
2191
2167
  getSettingsGroup(dataSource, entityMap, "email")
2192
2168
  ]);
2193
2169
  const companyDetails = mergeEmailLayoutCompanyDetails(branding, emailSettings);
2194
- const subject = chunkOOTLNH63_cjs.applyTemplateVars(resolved.subject ?? "Order confirmed", variables);
2195
- const bodyHtml = chunkOOTLNH63_cjs.applyTemplateVars(resolved.body, variables);
2170
+ const subject = chunkOOTLNH63_cjs.applyTemplateVars(template.subject ?? "Order update", variables);
2171
+ const bodyHtml = chunkOOTLNH63_cjs.applyTemplateVars(template.body, variables);
2196
2172
  const html = renderLayout({
2197
2173
  bodyHtml,
2198
2174
  companyDetails
@@ -2205,15 +2181,21 @@ async function sendOrderPlacedEmail(orderId, dataSource, entityMap, getCms, vari
2205
2181
  text: bodyHtml.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim()
2206
2182
  });
2207
2183
  console.log("[order-notifications] email queued", {
2184
+ triggerKey,
2208
2185
  orderId,
2209
2186
  to: contactEmail
2210
2187
  });
2211
2188
  }
2212
- chunkUSNT2KNT_cjs.__name(sendOrderPlacedEmail, "sendOrderPlacedEmail");
2189
+ chunkUSNT2KNT_cjs.__name(sendEmailForTrigger, "sendEmailForTrigger");
2213
2190
  async function sendWhatsAppForTrigger(triggerKey, orderId, phone, variables, dataSource, entityMap, getCms) {
2214
- const template = await loadBoundWhatsAppTemplate(triggerKey, dataSource, entityMap);
2191
+ const template = await loadBoundTemplate(triggerKey, "whatsapp", dataSource, entityMap);
2215
2192
  if (!template) return;
2216
- const paramOrder = template.providerMeta?.paramOrder?.length ? template.providerMeta.paramOrder : chunkSPQFNIYJ_cjs.EVENT_ORDER_WHATSAPP_PARAM_KEYS;
2193
+ const paramOrder = template.providerMeta?.paramOrder ?? [];
2194
+ if (paramOrder.length === 0) {
2195
+ console.warn("[order-notifications] WhatsApp template has no paramOrder set \u2014 variables may send blank/wrong", {
2196
+ triggerKey
2197
+ });
2198
+ }
2217
2199
  const cms = await getCms();
2218
2200
  const metaTemplateName = resolveMetaWhatsAppTemplateName({
2219
2201
  externalTemplateRef: template.externalTemplateRef,
@@ -2270,21 +2252,22 @@ async function handleTrigger(triggerKey, payload, dataSource, entityMap, getCms)
2270
2252
  const variables = mergeTriggerVariables(payload, context?.variables);
2271
2253
  const contactEmail = context?.contact.email?.trim() || "";
2272
2254
  const contactPhone = context?.contact.phone?.trim() || payload.customerPhone?.trim() || "";
2273
- if (triggerKey === "order_placed" && contactEmail) {
2274
- await sendOrderPlacedEmail(payload.orderId, dataSource, entityMap, getCms, variables, contactEmail);
2275
- } else if (triggerKey === "order_placed") {
2255
+ if (contactEmail) {
2256
+ await sendEmailForTrigger(triggerKey, payload.orderId, variables, contactEmail, dataSource, entityMap, getCms);
2257
+ } else {
2276
2258
  console.warn("[order-notifications] skip email: no customer email", {
2259
+ triggerKey,
2277
2260
  orderId: payload.orderId
2278
2261
  });
2279
2262
  }
2280
- if (!contactPhone) {
2263
+ if (contactPhone) {
2264
+ await sendWhatsAppForTrigger(triggerKey, payload.orderId, contactPhone, variables, dataSource, entityMap, getCms);
2265
+ } else {
2281
2266
  console.warn("[order-notifications] skip WhatsApp: no customer phone", {
2282
2267
  triggerKey,
2283
2268
  orderId: payload.orderId
2284
2269
  });
2285
- return;
2286
2270
  }
2287
- await sendWhatsAppForTrigger(triggerKey, payload.orderId, contactPhone, variables, dataSource, entityMap, getCms);
2288
2271
  }
2289
2272
  chunkUSNT2KNT_cjs.__name(handleTrigger, "handleTrigger");
2290
2273
  function initWhatsappTriggerDispatcher(deps) {
@@ -2296,7 +2279,7 @@ function initWhatsappTriggerDispatcher(deps) {
2296
2279
  console.error("[order-notifications]", triggerKey, err);
2297
2280
  });
2298
2281
  });
2299
- console.log("[order-notifications] dispatcher initialized (email + WhatsApp)");
2282
+ console.log("[order-notifications] dispatcher initialized (email + WhatsApp, unified via order_notification_bindings)");
2300
2283
  }
2301
2284
  chunkUSNT2KNT_cjs.__name(initWhatsappTriggerDispatcher, "initWhatsappTriggerDispatcher");
2302
2285
  async function resendOrderNotification(triggerKey, orderId, deps) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkKPKFNLQQ_cjs = require('./chunk-KPKFNLQQ.cjs');
3
+ var chunkWMXPKKXU_cjs = require('./chunk-WMXPKKXU.cjs');
4
4
  var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
5
5
  var jwt = require('next-auth/jwt');
6
6
  var _CredentialsProvider = require('next-auth/providers/credentials');
@@ -11,12 +11,12 @@ var _CredentialsProvider__default = /*#__PURE__*/_interopDefault(_CredentialsPro
11
11
 
12
12
  // src/auth/seed-permissions.ts
13
13
  async function seedAdministratorPermissions(dataSource, entityMap) {
14
- const entities = chunkKPKFNLQQ_cjs.getPermissionableEntityKeys(entityMap);
14
+ const entities = chunkWMXPKKXU_cjs.getPermissionableEntityKeys(entityMap);
15
15
  const groupRepo = dataSource.getRepository(entityMap.user_groups);
16
16
  const permRepo = dataSource.getRepository(entityMap.permissions);
17
17
  const adminGroup = await groupRepo.findOne({
18
18
  where: {
19
- name: chunkKPKFNLQQ_cjs.ADMIN_GROUP_NAME,
19
+ name: chunkWMXPKKXU_cjs.ADMIN_GROUP_NAME,
20
20
  deleted: false
21
21
  }
22
22
  });
@@ -298,18 +298,18 @@ async function checkMultiVendorEnabledViaSettingsApi() {
298
298
  chunkUSNT2KNT_cjs.__name(checkMultiVendorEnabledViaSettingsApi, "checkMultiVendorEnabledViaSettingsApi");
299
299
  function sessionUserFromNextAuthUser(user) {
300
300
  const g = user.group;
301
- const isRBACAdmin = chunkKPKFNLQQ_cjs.isSuperAdmin({
301
+ const isRBACAdmin = chunkWMXPKKXU_cjs.isSuperAdmin({
302
302
  groupId: user.groupId ?? void 0,
303
303
  groupName: g?.name,
304
304
  isRBACAdmin: false
305
305
  });
306
- const entityPerms = chunkKPKFNLQQ_cjs.permissionRowsToRecord(g?.permissions);
306
+ const entityPerms = chunkWMXPKKXU_cjs.permissionRowsToRecord(g?.permissions);
307
307
  const rawAdminAccess = user.adminAccess;
308
308
  const adminAccess = rawAdminAccess === true ? true : rawAdminAccess === false ? false : void 0;
309
309
  const vendorIds = user.vendorIds ?? [];
310
310
  const vendorRole = user.vendorRole ?? null;
311
311
  const isVendorRoleOwner = user.isVendorRoleOwner ?? false;
312
- const { isVendorPortal, isVendorOwner: isVendorOwner2 } = chunkKPKFNLQQ_cjs.vendorPortalFlagsFromUser({
312
+ const { isVendorPortal, isVendorOwner: isVendorOwner2 } = chunkWMXPKKXU_cjs.vendorPortalFlagsFromUser({
313
313
  email: user.email,
314
314
  isRBACAdmin,
315
315
  groupName: g?.name,
@@ -1,7 +1,6 @@
1
1
  import { notificationTriggerEmitter } from './chunk-HCIRL37O.js';
2
2
  import { queueEmail } from './chunk-5ELSW2UP.js';
3
3
  import { applyTemplateVars } from './chunk-CRFV5WJK.js';
4
- import { resolveEventOrderTemplate, EVENT_ORDER_WHATSAPP_PARAM_KEYS } from './chunk-KFFB6EMZ.js';
5
4
  import { __name } from './chunk-SHUYVCID.js';
6
5
  import { SESClient, SendEmailCommand } from '@aws-sdk/client-ses';
7
6
  import nodemailer from 'nodemailer';
@@ -434,9 +433,9 @@ var WhatsAppService = class {
434
433
  let body = opts.body?.trim() ?? "";
435
434
  const variables = opts.variables ?? {};
436
435
  if (opts.templateKey?.trim() && this.getMessageTemplateRow) {
437
- const { resolveEventOrderTemplate: resolveEventOrderTemplate2, EVENT_ORDER_TEMPLATE_KEY } = await import('./event-order-defaults-SDRNAZHC.js');
436
+ const { resolveEventOrderTemplate, EVENT_ORDER_TEMPLATE_KEY } = await import('./event-order-defaults-SDRNAZHC.js');
438
437
  if (opts.templateKey.trim() === EVENT_ORDER_TEMPLATE_KEY) {
439
- const resolved = await resolveEventOrderTemplate2("whatsapp", async (ch, key) => {
438
+ const resolved = await resolveEventOrderTemplate("whatsapp", async (ch, key) => {
440
439
  const row = await this.getMessageTemplateRow(ch, key);
441
440
  if (!row) return null;
442
441
  return {
@@ -2034,7 +2033,7 @@ function emailPlugin(config) {
2034
2033
  }
2035
2034
  __name(emailPlugin, "emailPlugin");
2036
2035
 
2037
- // src/lib/whatsapp-trigger-dispatcher.ts
2036
+ // src/lib/order-notification-dispatcher.ts
2038
2037
  var initialized = false;
2039
2038
  function maskPhone3(raw) {
2040
2039
  const digits = String(raw ?? "").replace(/\D/g, "");
@@ -2088,48 +2087,52 @@ async function isTriggerCatalogEnabled(triggerKey, dataSource, entityMap) {
2088
2087
  }
2089
2088
  }
2090
2089
  __name(isTriggerCatalogEnabled, "isTriggerCatalogEnabled");
2091
- async function loadBoundWhatsAppTemplate(triggerKey, dataSource, entityMap) {
2092
- if (!entityMap.whatsapp_trigger_bindings || !entityMap.message_templates) {
2093
- console.warn("[order-notifications] bindings or message_templates missing from entityMap");
2090
+ async function loadBoundTemplate(triggerKey, channel, dataSource, entityMap) {
2091
+ if (!entityMap.order_notification_bindings || !entityMap.message_templates) {
2092
+ console.warn("[order-notifications] order_notification_bindings or message_templates missing from entityMap");
2094
2093
  return null;
2095
2094
  }
2096
- const binding = await dataSource.getRepository(entityMap.whatsapp_trigger_bindings).findOne({
2095
+ const binding = await dataSource.getRepository(entityMap.order_notification_bindings).findOne({
2097
2096
  where: {
2098
2097
  triggerKey,
2098
+ channel,
2099
2099
  enabled: true
2100
2100
  }
2101
2101
  });
2102
2102
  if (!binding) {
2103
- console.warn("[order-notifications] no whatsapp_trigger_bindings row", {
2104
- triggerKey
2103
+ console.warn("[order-notifications] no order_notification_bindings row", {
2104
+ triggerKey,
2105
+ channel
2105
2106
  });
2106
2107
  return null;
2107
2108
  }
2108
2109
  const templateId = binding.messageTemplateId;
2109
2110
  if (templateId == null) {
2110
2111
  console.warn("[order-notifications] binding exists but no template selected", {
2111
- triggerKey
2112
+ triggerKey,
2113
+ channel
2112
2114
  });
2113
2115
  return null;
2114
2116
  }
2115
2117
  const template = await dataSource.getRepository(entityMap.message_templates).findOne({
2116
2118
  where: {
2117
2119
  id: templateId,
2118
- channel: "whatsapp",
2120
+ channel,
2119
2121
  deleted: false,
2120
2122
  enabled: true
2121
2123
  }
2122
2124
  });
2123
2125
  if (!template) {
2124
- console.warn("[order-notifications] bound WhatsApp template not found or disabled", {
2126
+ console.warn("[order-notifications] bound template not found or disabled", {
2125
2127
  triggerKey,
2128
+ channel,
2126
2129
  templateId
2127
2130
  });
2128
2131
  return null;
2129
2132
  }
2130
2133
  return template;
2131
2134
  }
2132
- __name(loadBoundWhatsAppTemplate, "loadBoundWhatsAppTemplate");
2135
+ __name(loadBoundTemplate, "loadBoundTemplate");
2133
2136
  function mergeTriggerVariables(payload, rich) {
2134
2137
  const basic = {
2135
2138
  orderId: String(payload.orderId ?? ""),
@@ -2150,43 +2153,16 @@ function mergeTriggerVariables(payload, rich) {
2150
2153
  };
2151
2154
  }
2152
2155
  __name(mergeTriggerVariables, "mergeTriggerVariables");
2153
- async function sendOrderPlacedEmail(orderId, dataSource, entityMap, getCms, variables, contactEmail) {
2154
- if (!entityMap.message_templates) return;
2155
- const templateRepo = dataSource.getRepository(entityMap.message_templates);
2156
- const getTemplateRow = /* @__PURE__ */ __name(async (channel, templateKey) => {
2157
- const row = await templateRepo.findOne({
2158
- where: {
2159
- channel,
2160
- templateKey,
2161
- deleted: false
2162
- }
2163
- });
2164
- if (!row) return null;
2165
- const r = row;
2166
- return {
2167
- subject: r.subject,
2168
- body: r.body,
2169
- externalTemplateRef: r.externalTemplateRef,
2170
- name: r.name,
2171
- language: r.providerMeta?.language ?? null,
2172
- paramOrder: r.providerMeta?.paramOrder ?? null,
2173
- enabled: r.enabled
2174
- };
2175
- }, "getTemplateRow");
2176
- const resolved = await resolveEventOrderTemplate("email", getTemplateRow, null);
2177
- if (!resolved?.enabled) {
2178
- console.warn("[order-notifications] email template disabled or missing for order_placed", {
2179
- orderId
2180
- });
2181
- return;
2182
- }
2156
+ async function sendEmailForTrigger(triggerKey, orderId, variables, contactEmail, dataSource, entityMap, getCms) {
2157
+ const template = await loadBoundTemplate(triggerKey, "email", dataSource, entityMap);
2158
+ if (!template) return;
2183
2159
  const [branding, emailSettings] = await Promise.all([
2184
2160
  getSettingsGroup(dataSource, entityMap, "branding"),
2185
2161
  getSettingsGroup(dataSource, entityMap, "email")
2186
2162
  ]);
2187
2163
  const companyDetails = mergeEmailLayoutCompanyDetails(branding, emailSettings);
2188
- const subject = applyTemplateVars(resolved.subject ?? "Order confirmed", variables);
2189
- const bodyHtml = applyTemplateVars(resolved.body, variables);
2164
+ const subject = applyTemplateVars(template.subject ?? "Order update", variables);
2165
+ const bodyHtml = applyTemplateVars(template.body, variables);
2190
2166
  const html = renderLayout({
2191
2167
  bodyHtml,
2192
2168
  companyDetails
@@ -2199,15 +2175,21 @@ async function sendOrderPlacedEmail(orderId, dataSource, entityMap, getCms, vari
2199
2175
  text: bodyHtml.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim()
2200
2176
  });
2201
2177
  console.log("[order-notifications] email queued", {
2178
+ triggerKey,
2202
2179
  orderId,
2203
2180
  to: contactEmail
2204
2181
  });
2205
2182
  }
2206
- __name(sendOrderPlacedEmail, "sendOrderPlacedEmail");
2183
+ __name(sendEmailForTrigger, "sendEmailForTrigger");
2207
2184
  async function sendWhatsAppForTrigger(triggerKey, orderId, phone, variables, dataSource, entityMap, getCms) {
2208
- const template = await loadBoundWhatsAppTemplate(triggerKey, dataSource, entityMap);
2185
+ const template = await loadBoundTemplate(triggerKey, "whatsapp", dataSource, entityMap);
2209
2186
  if (!template) return;
2210
- const paramOrder = template.providerMeta?.paramOrder?.length ? template.providerMeta.paramOrder : EVENT_ORDER_WHATSAPP_PARAM_KEYS;
2187
+ const paramOrder = template.providerMeta?.paramOrder ?? [];
2188
+ if (paramOrder.length === 0) {
2189
+ console.warn("[order-notifications] WhatsApp template has no paramOrder set \u2014 variables may send blank/wrong", {
2190
+ triggerKey
2191
+ });
2192
+ }
2211
2193
  const cms = await getCms();
2212
2194
  const metaTemplateName = resolveMetaWhatsAppTemplateName({
2213
2195
  externalTemplateRef: template.externalTemplateRef,
@@ -2264,21 +2246,22 @@ async function handleTrigger(triggerKey, payload, dataSource, entityMap, getCms)
2264
2246
  const variables = mergeTriggerVariables(payload, context?.variables);
2265
2247
  const contactEmail = context?.contact.email?.trim() || "";
2266
2248
  const contactPhone = context?.contact.phone?.trim() || payload.customerPhone?.trim() || "";
2267
- if (triggerKey === "order_placed" && contactEmail) {
2268
- await sendOrderPlacedEmail(payload.orderId, dataSource, entityMap, getCms, variables, contactEmail);
2269
- } else if (triggerKey === "order_placed") {
2249
+ if (contactEmail) {
2250
+ await sendEmailForTrigger(triggerKey, payload.orderId, variables, contactEmail, dataSource, entityMap, getCms);
2251
+ } else {
2270
2252
  console.warn("[order-notifications] skip email: no customer email", {
2253
+ triggerKey,
2271
2254
  orderId: payload.orderId
2272
2255
  });
2273
2256
  }
2274
- if (!contactPhone) {
2257
+ if (contactPhone) {
2258
+ await sendWhatsAppForTrigger(triggerKey, payload.orderId, contactPhone, variables, dataSource, entityMap, getCms);
2259
+ } else {
2275
2260
  console.warn("[order-notifications] skip WhatsApp: no customer phone", {
2276
2261
  triggerKey,
2277
2262
  orderId: payload.orderId
2278
2263
  });
2279
- return;
2280
2264
  }
2281
- await sendWhatsAppForTrigger(triggerKey, payload.orderId, contactPhone, variables, dataSource, entityMap, getCms);
2282
2265
  }
2283
2266
  __name(handleTrigger, "handleTrigger");
2284
2267
  function initWhatsappTriggerDispatcher(deps) {
@@ -2290,7 +2273,7 @@ function initWhatsappTriggerDispatcher(deps) {
2290
2273
  console.error("[order-notifications]", triggerKey, err);
2291
2274
  });
2292
2275
  });
2293
- console.log("[order-notifications] dispatcher initialized (email + WhatsApp)");
2276
+ console.log("[order-notifications] dispatcher initialized (email + WhatsApp, unified via order_notification_bindings)");
2294
2277
  }
2295
2278
  __name(initWhatsappTriggerDispatcher, "initWhatsappTriggerDispatcher");
2296
2279
  async function resendOrderNotification(triggerKey, orderId, deps) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkKPKFNLQQ_cjs = require('./chunk-KPKFNLQQ.cjs');
3
+ var chunkWMXPKKXU_cjs = require('./chunk-WMXPKKXU.cjs');
4
4
  var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
5
5
 
6
6
  // src/auth/helpers.ts
@@ -10,7 +10,7 @@ var RBAC_ADMIN_ONLY_ENTITIES = /* @__PURE__ */ new Set([
10
10
  "permissions"
11
11
  ]);
12
12
  function sessionHasEntityAccess(user, entity, action) {
13
- return chunkKPKFNLQQ_cjs.explainSessionEntityAccess(user, entity, action).allowed;
13
+ return chunkWMXPKKXU_cjs.explainSessionEntityAccess(user, entity, action).allowed;
14
14
  }
15
15
  chunkUSNT2KNT_cjs.__name(sessionHasEntityAccess, "sessionHasEntityAccess");
16
16
  function canManageRoles(user) {
@@ -101,8 +101,8 @@ function createAuthHelpersFromGetSession(getSession, NextResponse) {
101
101
  }
102
102
  const u = session.user;
103
103
  const allowed = sessionHasEntityAccess(u, entity, action);
104
- const { reason } = chunkKPKFNLQQ_cjs.explainSessionEntityAccess(u, entity, action);
105
- chunkKPKFNLQQ_cjs.logRbac("authHelpers.requireEntityPermission", {
104
+ const { reason } = chunkWMXPKKXU_cjs.explainSessionEntityAccess(u, entity, action);
105
+ chunkWMXPKKXU_cjs.logRbac("authHelpers.requireEntityPermission", {
106
106
  entity,
107
107
  action,
108
108
  allowed,
@@ -134,10 +134,10 @@ function createAuthHelpersFromGetSession(getSession, NextResponse) {
134
134
  }
135
135
  const u = session.user;
136
136
  if (u.isRBACAdmin) return null;
137
- if (chunkKPKFNLQQ_cjs.isVendorPortalUser(u)) return null;
137
+ if (chunkWMXPKKXU_cjs.isVendorPortalUser(u)) return null;
138
138
  if (u.adminAccess === true) return null;
139
139
  if (u.adminAccess === false) {
140
- chunkKPKFNLQQ_cjs.logRbac("requireAdminAccess denied (adminAccess:false)", {
140
+ chunkWMXPKKXU_cjs.logRbac("requireAdminAccess denied (adminAccess:false)", {
141
141
  email: u.email,
142
142
  groupName: u.groupName,
143
143
  isVendorPortal: u.isVendorPortal
@@ -149,7 +149,7 @@ function createAuthHelpersFromGetSession(getSession, NextResponse) {
149
149
  status: 403
150
150
  });
151
151
  }
152
- chunkKPKFNLQQ_cjs.logRbac("requireAdminAccess denied (no matching rule)", {
152
+ chunkWMXPKKXU_cjs.logRbac("requireAdminAccess denied (no matching rule)", {
153
153
  email: u.email,
154
154
  adminAccess: u.adminAccess,
155
155
  groupName: u.groupName,
@@ -16,7 +16,7 @@ var PERMISSION_ENTITY_INTERNAL_EXCLUDE = /* @__PURE__ */ new Set([
16
16
  "wishlist_items",
17
17
  "message_templates",
18
18
  "order_notification_triggers",
19
- "whatsapp_trigger_bindings",
19
+ "order_notification_bindings",
20
20
  "vendor_users",
21
21
  "vendor_roles",
22
22
  "vendor_role_permissions"
@@ -127,7 +127,8 @@ var VENDOR_SCOPED_STORE_ENTITIES = /* @__PURE__ */ new Set([
127
127
  "vendor_customers",
128
128
  "discounts",
129
129
  "events",
130
- "refund_policies"
130
+ "refund_policies",
131
+ "combos"
131
132
  ]);
132
133
  var VENDOR_STORE_RBAC_ENTITIES = /* @__PURE__ */ new Set([
133
134
  ...VENDOR_SCOPED_STORE_ENTITIES,
@@ -592,7 +593,7 @@ async function logEntityAccessDecision(dataSource, context, user, entity, action
592
593
  const id = Number(user.id);
593
594
  if (Number.isFinite(id)) {
594
595
  try {
595
- const { loadDbPermissionsForUser } = await import('./rbac-debug-db-QJH3AD34.js');
596
+ const { loadDbPermissionsForUser } = await import('./rbac-debug-db-QWHOENBR.js');
596
597
  dbPermissions = await loadDbPermissionsForUser(dataSource, id);
597
598
  } catch (e) {
598
599
  dbPermissions = {