@infuro/cms-core 1.0.45 → 1.0.47
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/README.md +19 -2
- package/dist/admin.cjs +4249 -2872
- package/dist/admin.d.cts +24 -4
- package/dist/admin.d.ts +24 -4
- package/dist/admin.js +3179 -1804
- package/dist/api.cjs +41 -39
- package/dist/api.d.cts +10 -4
- package/dist/api.d.ts +10 -4
- package/dist/api.js +9 -7
- package/dist/auth.cjs +55 -51
- package/dist/auth.d.cts +6 -3
- package/dist/auth.d.ts +6 -3
- package/dist/auth.js +3 -3
- package/dist/{chunk-KFFB6EMZ.js → chunk-2HU5R2JE.js} +2 -0
- package/dist/chunk-2IAXTKQN.cjs +19 -0
- package/dist/chunk-2KUCQVAQ.js +936 -0
- package/dist/chunk-3K5AIEIZ.js +256 -0
- package/dist/{chunk-SPQFNIYJ.cjs → chunk-4PMK3RNA.cjs} +2 -0
- package/dist/{chunk-X6UQFV4X.cjs → chunk-77NUXO6A.cjs} +14 -12
- package/dist/chunk-BXYZDMTZ.cjs +953 -0
- package/dist/chunk-DBPSJYLZ.js +47 -0
- package/dist/chunk-EIZKW2PF.js +13 -0
- package/dist/chunk-HY3AXLOI.cjs +265 -0
- package/dist/{chunk-X47PBV4I.js → chunk-JE22VP6S.js} +1 -0
- package/dist/{chunk-DN65KDIA.js → chunk-JIWUVQ6B.js} +14 -13
- package/dist/{chunk-HT5DI3XW.cjs → chunk-KOTXDSQB.cjs} +1 -0
- package/dist/chunk-L3525VXI.js +243 -0
- package/dist/{chunk-22FFHLTO.cjs → chunk-LMJ7RKPF.cjs} +421 -150
- package/dist/chunk-OY2YTBMP.cjs +50 -0
- package/dist/{chunk-TAHX46EI.cjs → chunk-Q3HQEM4R.cjs} +15 -7
- package/dist/chunk-V25RDUOU.cjs +248 -0
- package/dist/{chunk-ZMRQ72F6.cjs → chunk-VUQFARRT.cjs} +10 -10
- package/dist/{chunk-MVXLRANV.js → chunk-W42UZLQO.js} +1977 -891
- package/dist/{chunk-F5XFHYTG.cjs → chunk-XUCKZPML.cjs} +2088 -991
- package/dist/{chunk-I6NH72MO.js → chunk-YC4NUZCS.js} +10 -2
- package/dist/{chunk-NNQBWDCI.js → chunk-YXH2UUEZ.js} +418 -146
- package/dist/{chunk-BLR6H5GL.js → chunk-ZF2RQWXB.js} +4 -4
- package/dist/cli.cjs +9 -4
- package/dist/cli.js +9 -4
- package/dist/{email-queue-TPZWLTIV.cjs → email-queue-6NJY6HNM.cjs} +7 -5
- package/dist/email-queue-OI2HSCGE.js +4 -0
- package/dist/{emit-order-notification-trigger-IVLWKKJL.js → emit-order-notification-trigger-6XX7LSC4.js} +1 -1
- package/dist/{emit-order-notification-trigger-D2N3KFHL.cjs → emit-order-notification-trigger-NASG7ZEO.cjs} +3 -3
- package/dist/erp-order-invoice-3GXDE443.js +3 -0
- package/dist/erp-order-invoice-EYYNR526.cjs +24 -0
- package/dist/{event-order-defaults-EMWBIGL3.cjs → event-order-defaults-7Z3UZOEH.cjs} +9 -9
- package/dist/{event-order-defaults-SDRNAZHC.js → event-order-defaults-XQ3IDPD7.js} +1 -1
- package/dist/hooks.cjs +43 -0
- package/dist/hooks.d.cts +10 -1
- package/dist/hooks.d.ts +10 -1
- package/dist/hooks.js +39 -1
- package/dist/index.cjs +429 -298
- package/dist/index.d.cts +317 -30
- package/dist/index.d.ts +317 -30
- package/dist/index.js +17 -13
- package/dist/migrations/1781810000000-OrderItemsVariantId.ts +44 -0
- package/dist/migrations/1781900000000-UserInviteStatusToken.ts +46 -0
- package/dist/migrations/1782000000000-ComboSlug.ts +58 -0
- package/dist/migrations/1782100000000-DiscountDeviceType.ts +20 -0
- package/dist/migrations/1782200000000-VendorTeamProfiles.ts +233 -0
- package/dist/migrations/1782300000000-AddTypeToOrderNotificationBindings.ts +75 -0
- package/dist/order-inventory-2MYRKEPC.cjs +39 -0
- package/dist/order-inventory-76V4XIGW.js +2 -0
- package/dist/{order-notification-dispatcher-XWIJYDGA.js → order-notification-dispatcher-6WNG24NY.js} +4 -2
- package/dist/{order-notification-dispatcher-RU7BTGGX.cjs → order-notification-dispatcher-6XSU3AR7.cjs} +6 -4
- package/dist/{rbac-debug-db-2SGNLANF.js → rbac-debug-db-6EMIVMGF.js} +1 -1
- package/dist/{rbac-debug-db-4Z6A425H.cjs → rbac-debug-db-6PWTLBEL.cjs} +2 -2
- package/dist/retire-soft-deleted-unique-5VXBA5XX.cjs +15 -0
- package/dist/retire-soft-deleted-unique-NXQIH4BC.js +2 -0
- package/dist/theme.cjs +6 -1
- package/dist/theme.d.cts +4 -1
- package/dist/theme.d.ts +4 -1
- package/dist/theme.js +3 -1
- package/package.json +5 -4
- package/src/admin/admin.css +34 -24
- package/dist/chunk-5ELSW2UP.js +0 -150
- package/dist/chunk-PNOKNSG2.cjs +0 -222
- package/dist/chunk-WEMDMVHQ.js +0 -216
- package/dist/chunk-XW5ATPRW.cjs +0 -155
- package/dist/email-queue-CGZBVVAS.js +0 -2
- package/dist/erp-order-invoice-3YISSOWW.js +0 -3
- package/dist/erp-order-invoice-ZR5F2KTA.cjs +0 -12
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
|
|
4
|
+
|
|
5
|
+
// src/lib/retire-soft-deleted-unique.ts
|
|
6
|
+
async function retireSoftDeletedUniqueValue(repo, column, value) {
|
|
7
|
+
const trimmed = typeof value === "string" ? value.trim() : "";
|
|
8
|
+
if (!trimmed) return;
|
|
9
|
+
const cols = new Set(repo.metadata.columns.map((c) => c.propertyName));
|
|
10
|
+
if (!cols.has(column) || !cols.has("deleted")) return;
|
|
11
|
+
const rows = await repo.find({
|
|
12
|
+
where: {
|
|
13
|
+
[column]: trimmed,
|
|
14
|
+
deleted: true
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
for (const row of rows) {
|
|
18
|
+
const id = row.id;
|
|
19
|
+
if (!Number.isFinite(id)) continue;
|
|
20
|
+
const current = String(row[column] ?? "");
|
|
21
|
+
if (current.includes("__deleted_")) continue;
|
|
22
|
+
await repo.update(id, {
|
|
23
|
+
[column]: `${trimmed}__deleted_${id}`
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
chunkUSNT2KNT_cjs.__name(retireSoftDeletedUniqueValue, "retireSoftDeletedUniqueValue");
|
|
28
|
+
async function activeUniqueValueExists(repo, column, value, excludeId) {
|
|
29
|
+
const trimmed = typeof value === "string" ? value.trim() : "";
|
|
30
|
+
if (!trimmed) return false;
|
|
31
|
+
const cols = new Set(repo.metadata.columns.map((c) => c.propertyName));
|
|
32
|
+
if (!cols.has(column)) return false;
|
|
33
|
+
const qb = repo.createQueryBuilder("row").where(`row.${column} = :value`, {
|
|
34
|
+
value: trimmed
|
|
35
|
+
});
|
|
36
|
+
if (cols.has("deleted")) {
|
|
37
|
+
qb.andWhere("row.deleted = false");
|
|
38
|
+
}
|
|
39
|
+
if (excludeId != null && Number.isFinite(excludeId) && excludeId > 0) {
|
|
40
|
+
qb.andWhere("row.id != :excludeId", {
|
|
41
|
+
excludeId
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const hit = await qb.getOne();
|
|
45
|
+
return !!hit;
|
|
46
|
+
}
|
|
47
|
+
chunkUSNT2KNT_cjs.__name(activeUniqueValueExists, "activeUniqueValueExists");
|
|
48
|
+
|
|
49
|
+
exports.activeUniqueValueExists = activeUniqueValueExists;
|
|
50
|
+
exports.retireSoftDeletedUniqueValue = retireSoftDeletedUniqueValue;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk77NUXO6A_cjs = require('./chunk-77NUXO6A.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 =
|
|
14
|
+
const entities = chunk77NUXO6A_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:
|
|
19
|
+
name: chunk77NUXO6A_cjs.ADMIN_GROUP_NAME,
|
|
20
20
|
deleted: false
|
|
21
21
|
}
|
|
22
22
|
});
|
|
@@ -299,18 +299,18 @@ async function checkMultiVendorEnabledViaSettingsApi() {
|
|
|
299
299
|
chunkUSNT2KNT_cjs.__name(checkMultiVendorEnabledViaSettingsApi, "checkMultiVendorEnabledViaSettingsApi");
|
|
300
300
|
function sessionUserFromNextAuthUser(user) {
|
|
301
301
|
const g = user.group;
|
|
302
|
-
const isRBACAdmin =
|
|
302
|
+
const isRBACAdmin = chunk77NUXO6A_cjs.isSuperAdmin({
|
|
303
303
|
groupId: user.groupId ?? void 0,
|
|
304
304
|
groupName: g?.name,
|
|
305
305
|
isRBACAdmin: false
|
|
306
306
|
});
|
|
307
|
-
const entityPerms =
|
|
307
|
+
const entityPerms = chunk77NUXO6A_cjs.permissionRowsToRecord(g?.permissions);
|
|
308
308
|
const rawAdminAccess = user.adminAccess;
|
|
309
309
|
const adminAccess = rawAdminAccess === true ? true : rawAdminAccess === false ? false : void 0;
|
|
310
310
|
const vendorIds = user.vendorIds ?? [];
|
|
311
311
|
const vendorRole = user.vendorRole ?? null;
|
|
312
312
|
const isVendorRoleOwner = user.isVendorRoleOwner ?? false;
|
|
313
|
-
const { isVendorPortal, isVendorOwner: isVendorOwner2 } =
|
|
313
|
+
const { isVendorPortal, isVendorOwner: isVendorOwner2 } = chunk77NUXO6A_cjs.vendorPortalFlagsFromUser({
|
|
314
314
|
email: user.email,
|
|
315
315
|
isRBACAdmin,
|
|
316
316
|
groupName: g?.name,
|
|
@@ -405,6 +405,14 @@ function getNextAuthOptions(config) {
|
|
|
405
405
|
});
|
|
406
406
|
return null;
|
|
407
407
|
}
|
|
408
|
+
if (user.inviteStatus === "pending") {
|
|
409
|
+
logAuth("authorize(credentials) rejected", {
|
|
410
|
+
reason: "invite_pending",
|
|
411
|
+
email,
|
|
412
|
+
userId: user.id
|
|
413
|
+
});
|
|
414
|
+
return null;
|
|
415
|
+
}
|
|
408
416
|
if (user.deleted) {
|
|
409
417
|
logAuth("authorize(credentials) rejected", {
|
|
410
418
|
reason: "deleted",
|
|
@@ -494,7 +502,7 @@ function getNextAuthOptions(config) {
|
|
|
494
502
|
channel: ch,
|
|
495
503
|
code
|
|
496
504
|
});
|
|
497
|
-
if (!user || user.blocked || user.deleted) return null;
|
|
505
|
+
if (!user || user.blocked || user.inviteStatus === "pending" || user.deleted) return null;
|
|
498
506
|
if (isCustomerGroupUser(user) && !permitsCustomerLogin(allowCustomerLogin, creds)) {
|
|
499
507
|
logAuth("authorize(otp) rejected", {
|
|
500
508
|
reason: "customer_group",
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkBXYZDMTZ_cjs = require('./chunk-BXYZDMTZ.cjs');
|
|
4
|
+
var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
|
|
5
|
+
|
|
6
|
+
// src/plugins/email/email-queue.ts
|
|
7
|
+
var EMAIL_QUEUE_NAME = "email";
|
|
8
|
+
var registeredInvoiceOptions = {};
|
|
9
|
+
async function resolveInvoiceAttachmentForJob(cms, payload, options) {
|
|
10
|
+
if (!payload.attachInvoice || payload.orderId == null || payload.orderId < 1) {
|
|
11
|
+
return {
|
|
12
|
+
attachments: payload.attachments,
|
|
13
|
+
invoiceAttached: false
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const entityMap = options.entityMap;
|
|
17
|
+
if (!entityMap?.orders) {
|
|
18
|
+
console.warn("[email] attachInvoice skipped: entityMap not registered on email queue processor");
|
|
19
|
+
return {
|
|
20
|
+
attachments: payload.attachments,
|
|
21
|
+
invoiceAttached: false
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
let dataSource;
|
|
25
|
+
try {
|
|
26
|
+
dataSource = options.getDataSource ? await options.getDataSource() : cms.dataSource;
|
|
27
|
+
} catch (err) {
|
|
28
|
+
console.error("[email] attachInvoice: getDataSource failed", err);
|
|
29
|
+
return {
|
|
30
|
+
attachments: payload.attachments,
|
|
31
|
+
invoiceAttached: false
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (!dataSource) {
|
|
35
|
+
console.warn("[email] attachInvoice skipped: no dataSource");
|
|
36
|
+
return {
|
|
37
|
+
attachments: payload.attachments,
|
|
38
|
+
invoiceAttached: false
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const order = await dataSource.getRepository(entityMap.orders).findOne({
|
|
43
|
+
where: {
|
|
44
|
+
id: payload.orderId,
|
|
45
|
+
deleted: false
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
if (!order) return {
|
|
49
|
+
attachments: payload.attachments,
|
|
50
|
+
invoiceAttached: false
|
|
51
|
+
};
|
|
52
|
+
const o = order;
|
|
53
|
+
if (!chunkBXYZDMTZ_cjs.isOrderEligibleForInvoiceEmail(o.status, o.orderKind)) {
|
|
54
|
+
return {
|
|
55
|
+
attachments: payload.attachments,
|
|
56
|
+
invoiceAttached: false
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const resolved = await chunkBXYZDMTZ_cjs.resolveOrderInvoicePdfBytes(cms, dataSource, entityMap, payload.orderId);
|
|
60
|
+
if ("error" in resolved) {
|
|
61
|
+
console.warn("[email] order invoice attach failed", {
|
|
62
|
+
orderId: payload.orderId,
|
|
63
|
+
error: resolved.error,
|
|
64
|
+
status: resolved.status
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
attachments: payload.attachments,
|
|
68
|
+
invoiceAttached: false
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const invoiceAtt = {
|
|
72
|
+
filename: resolved.filename,
|
|
73
|
+
content: resolved.bytes,
|
|
74
|
+
contentType: resolved.contentType
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
attachments: [
|
|
78
|
+
...payload.attachments ?? [],
|
|
79
|
+
invoiceAtt
|
|
80
|
+
],
|
|
81
|
+
invoiceAttached: true
|
|
82
|
+
};
|
|
83
|
+
} catch (err) {
|
|
84
|
+
console.error("[email] order invoice attach error", {
|
|
85
|
+
orderId: payload.orderId,
|
|
86
|
+
err
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
attachments: payload.attachments,
|
|
90
|
+
invoiceAttached: false
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
chunkUSNT2KNT_cjs.__name(resolveInvoiceAttachmentForJob, "resolveInvoiceAttachmentForJob");
|
|
95
|
+
async function sendRendered(email, to, subject, html, text, attachments) {
|
|
96
|
+
await email.send({
|
|
97
|
+
to,
|
|
98
|
+
subject,
|
|
99
|
+
html,
|
|
100
|
+
text,
|
|
101
|
+
attachments
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
chunkUSNT2KNT_cjs.__name(sendRendered, "sendRendered");
|
|
105
|
+
function registerEmailQueueProcessor(cms, options = {}) {
|
|
106
|
+
registeredInvoiceOptions = options;
|
|
107
|
+
const queue = cms.getPlugin("queue");
|
|
108
|
+
const email = cms.getPlugin("email");
|
|
109
|
+
if (!queue || !email) return;
|
|
110
|
+
queue.registerProcessor(EMAIL_QUEUE_NAME, async (data) => {
|
|
111
|
+
const payload = data;
|
|
112
|
+
const { to, templateName, ctx, subject, html, text } = payload;
|
|
113
|
+
if (!to) return;
|
|
114
|
+
const attachmentsResult = await resolveInvoiceAttachmentForJob(cms, payload, registeredInvoiceOptions);
|
|
115
|
+
if (templateName && ctx) {
|
|
116
|
+
const rendered = email.renderTemplate(templateName, {
|
|
117
|
+
...ctx,
|
|
118
|
+
invoiceAttached: attachmentsResult.invoiceAttached
|
|
119
|
+
});
|
|
120
|
+
await sendRendered(email, to, rendered.subject, rendered.html, rendered.text, attachmentsResult.attachments);
|
|
121
|
+
} else if (subject != null && html != null) {
|
|
122
|
+
await sendRendered(email, to, subject, html, text, attachmentsResult.attachments);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
chunkUSNT2KNT_cjs.__name(registerEmailQueueProcessor, "registerEmailQueueProcessor");
|
|
127
|
+
async function queueEmail(cms, payload) {
|
|
128
|
+
const queue = cms.getPlugin("queue");
|
|
129
|
+
if (queue) {
|
|
130
|
+
await queue.add(EMAIL_QUEUE_NAME, payload);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const email = cms.getPlugin("email");
|
|
134
|
+
if (!email) return;
|
|
135
|
+
const attachmentsResult = await resolveInvoiceAttachmentForJob(cms, payload, registeredInvoiceOptions);
|
|
136
|
+
if (payload.templateName && payload.ctx) {
|
|
137
|
+
const rendered = email.renderTemplate(payload.templateName, {
|
|
138
|
+
...payload.ctx,
|
|
139
|
+
invoiceAttached: attachmentsResult.invoiceAttached
|
|
140
|
+
});
|
|
141
|
+
await sendRendered(email, payload.to, rendered.subject, rendered.html, rendered.text, attachmentsResult.attachments);
|
|
142
|
+
} else if (payload.subject != null && payload.html != null) {
|
|
143
|
+
await sendRendered(email, payload.to, payload.subject, payload.html, payload.text, attachmentsResult.attachments ?? payload.attachments);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
chunkUSNT2KNT_cjs.__name(queueEmail, "queueEmail");
|
|
147
|
+
async function queueOrderPlacedEmails(cms, payload) {
|
|
148
|
+
const { orderNumber, total, subtotal, tax, currency, customerName, customerEmail, salesTeamEmails, companyDetails, lineItems, billingAddress, shippingAddress, orderId, attachInvoiceToCustomer = true } = payload;
|
|
149
|
+
const base = {
|
|
150
|
+
orderNumber,
|
|
151
|
+
total: total != null ? String(total) : void 0,
|
|
152
|
+
subtotal: subtotal != null ? String(subtotal) : void 0,
|
|
153
|
+
tax: tax != null ? String(tax) : void 0,
|
|
154
|
+
currency,
|
|
155
|
+
customerName,
|
|
156
|
+
companyDetails: companyDetails ?? {},
|
|
157
|
+
lineItems: lineItems ?? [],
|
|
158
|
+
billingAddress,
|
|
159
|
+
shippingAddress
|
|
160
|
+
};
|
|
161
|
+
const customerLower = customerEmail?.trim().toLowerCase() ?? "";
|
|
162
|
+
const jobs = [];
|
|
163
|
+
const shouldAttach = attachInvoiceToCustomer && orderId != null && Number.isFinite(orderId) && orderId > 0;
|
|
164
|
+
if (customerEmail?.trim()) {
|
|
165
|
+
jobs.push(queueEmail(cms, {
|
|
166
|
+
to: customerEmail.trim(),
|
|
167
|
+
templateName: "orderPlaced",
|
|
168
|
+
ctx: {
|
|
169
|
+
...base,
|
|
170
|
+
audience: "customer"
|
|
171
|
+
},
|
|
172
|
+
...shouldAttach ? {
|
|
173
|
+
orderId,
|
|
174
|
+
attachInvoice: true
|
|
175
|
+
} : {}
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
const seen = /* @__PURE__ */ new Set();
|
|
179
|
+
for (const raw of salesTeamEmails) {
|
|
180
|
+
const to = raw.trim();
|
|
181
|
+
if (!to) continue;
|
|
182
|
+
const key = to.toLowerCase();
|
|
183
|
+
if (seen.has(key)) continue;
|
|
184
|
+
seen.add(key);
|
|
185
|
+
if (customerLower && key === customerLower) continue;
|
|
186
|
+
jobs.push(queueEmail(cms, {
|
|
187
|
+
to,
|
|
188
|
+
templateName: "orderPlaced",
|
|
189
|
+
ctx: {
|
|
190
|
+
...base,
|
|
191
|
+
audience: "sales",
|
|
192
|
+
internalCustomerEmail: customerEmail?.trim() || void 0
|
|
193
|
+
}
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
await Promise.all(jobs);
|
|
197
|
+
}
|
|
198
|
+
chunkUSNT2KNT_cjs.__name(queueOrderPlacedEmails, "queueOrderPlacedEmails");
|
|
199
|
+
async function queueVendorOnboardEmails(cms, payload) {
|
|
200
|
+
const { vendorName, vendorSlug, ownerName, ownerEmail, activation, inviteLink, signInLink, kind = "vendor_onboard", notifyEmails, companyDetails, sendToOwner = true } = payload;
|
|
201
|
+
const base = {
|
|
202
|
+
vendorName,
|
|
203
|
+
vendorSlug,
|
|
204
|
+
ownerName,
|
|
205
|
+
ownerEmail,
|
|
206
|
+
activation,
|
|
207
|
+
inviteLink,
|
|
208
|
+
signInLink,
|
|
209
|
+
kind,
|
|
210
|
+
companyDetails: companyDetails ?? {}
|
|
211
|
+
};
|
|
212
|
+
const ownerLower = ownerEmail?.trim().toLowerCase() ?? "";
|
|
213
|
+
const jobs = [];
|
|
214
|
+
if (sendToOwner && ownerEmail?.trim()) {
|
|
215
|
+
jobs.push(queueEmail(cms, {
|
|
216
|
+
to: ownerEmail.trim(),
|
|
217
|
+
templateName: "vendorOnboarded",
|
|
218
|
+
ctx: {
|
|
219
|
+
...base,
|
|
220
|
+
audience: "owner"
|
|
221
|
+
}
|
|
222
|
+
}));
|
|
223
|
+
}
|
|
224
|
+
const seen = /* @__PURE__ */ new Set();
|
|
225
|
+
for (const raw of notifyEmails) {
|
|
226
|
+
const to = raw.trim();
|
|
227
|
+
if (!to) continue;
|
|
228
|
+
const key = to.toLowerCase();
|
|
229
|
+
if (seen.has(key)) continue;
|
|
230
|
+
seen.add(key);
|
|
231
|
+
if (ownerLower && key === ownerLower) continue;
|
|
232
|
+
jobs.push(queueEmail(cms, {
|
|
233
|
+
to,
|
|
234
|
+
templateName: "vendorOnboarded",
|
|
235
|
+
ctx: {
|
|
236
|
+
...base,
|
|
237
|
+
audience: "internal"
|
|
238
|
+
}
|
|
239
|
+
}));
|
|
240
|
+
}
|
|
241
|
+
await Promise.all(jobs);
|
|
242
|
+
}
|
|
243
|
+
chunkUSNT2KNT_cjs.__name(queueVendorOnboardEmails, "queueVendorOnboardEmails");
|
|
244
|
+
|
|
245
|
+
exports.queueEmail = queueEmail;
|
|
246
|
+
exports.queueOrderPlacedEmails = queueOrderPlacedEmails;
|
|
247
|
+
exports.queueVendorOnboardEmails = queueVendorOnboardEmails;
|
|
248
|
+
exports.registerEmailQueueProcessor = registerEmailQueueProcessor;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk77NUXO6A_cjs = require('./chunk-77NUXO6A.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
|
|
13
|
+
return chunk77NUXO6A_cjs.explainSessionEntityAccess(user, entity, action).allowed;
|
|
14
14
|
}
|
|
15
15
|
chunkUSNT2KNT_cjs.__name(sessionHasEntityAccess, "sessionHasEntityAccess");
|
|
16
16
|
function canManageRoles(user) {
|
|
@@ -68,7 +68,7 @@ function createCmsAuthBundle(getSession, NextResponse) {
|
|
|
68
68
|
chunkUSNT2KNT_cjs.__name(createCmsAuthBundle, "createCmsAuthBundle");
|
|
69
69
|
function createAuthHelpersFromGetSession(getSession, NextResponse) {
|
|
70
70
|
return {
|
|
71
|
-
async requireAuth() {
|
|
71
|
+
async requireAuth(_req) {
|
|
72
72
|
const session = await getSession();
|
|
73
73
|
if (!session?.user?.email) {
|
|
74
74
|
return NextResponse.json({
|
|
@@ -79,7 +79,7 @@ function createAuthHelpersFromGetSession(getSession, NextResponse) {
|
|
|
79
79
|
}
|
|
80
80
|
return null;
|
|
81
81
|
},
|
|
82
|
-
async requirePermission() {
|
|
82
|
+
async requirePermission(_req, _permission) {
|
|
83
83
|
const session = await getSession();
|
|
84
84
|
if (!session?.user?.email) {
|
|
85
85
|
return NextResponse.json({
|
|
@@ -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 } =
|
|
105
|
-
|
|
104
|
+
const { reason } = chunk77NUXO6A_cjs.explainSessionEntityAccess(u, entity, action);
|
|
105
|
+
chunk77NUXO6A_cjs.logRbac("authHelpers.requireEntityPermission", {
|
|
106
106
|
entity,
|
|
107
107
|
action,
|
|
108
108
|
allowed,
|
|
@@ -123,7 +123,7 @@ function createAuthHelpersFromGetSession(getSession, NextResponse) {
|
|
|
123
123
|
status: 403
|
|
124
124
|
});
|
|
125
125
|
},
|
|
126
|
-
async requireAdminAccess() {
|
|
126
|
+
async requireAdminAccess(_req) {
|
|
127
127
|
const session = await getSession();
|
|
128
128
|
if (!session?.user?.email) {
|
|
129
129
|
return NextResponse.json({
|
|
@@ -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 (
|
|
137
|
+
if (chunk77NUXO6A_cjs.isVendorPortalUser(u)) return null;
|
|
138
138
|
if (u.adminAccess === true) return null;
|
|
139
139
|
if (u.adminAccess === false) {
|
|
140
|
-
|
|
140
|
+
chunk77NUXO6A_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
|
-
|
|
152
|
+
chunk77NUXO6A_cjs.logRbac("requireAdminAccess denied (no matching rule)", {
|
|
153
153
|
email: u.email,
|
|
154
154
|
adminAccess: u.adminAccess,
|
|
155
155
|
groupName: u.groupName,
|