@infuro/cms-core 1.0.38 → 1.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin.cjs +1 -1
- package/dist/admin.js +1 -1
- package/dist/api.cjs +32 -32
- package/dist/api.js +1 -1
- package/dist/{chunk-VJDUKAJ3.cjs → chunk-ERJK5QXN.cjs} +108 -49
- package/dist/{chunk-PYUXVU75.js → chunk-SFDZMGHD.js} +108 -49
- package/dist/index.cjs +186 -186
- package/dist/index.js +2 -2
- package/package.json +147 -147
package/dist/admin.cjs
CHANGED
|
@@ -492,7 +492,7 @@ var init_admin_config_context = __esm({
|
|
|
492
492
|
var CMS_VERSION;
|
|
493
493
|
var init_cms_version = __esm({
|
|
494
494
|
"src/lib/cms-version.ts"() {
|
|
495
|
-
CMS_VERSION = "1.0.
|
|
495
|
+
CMS_VERSION = "1.0.39" ;
|
|
496
496
|
}
|
|
497
497
|
});
|
|
498
498
|
function useCatalogCategories(enabled = true) {
|
package/dist/admin.js
CHANGED
|
@@ -457,7 +457,7 @@ var init_admin_config_context = __esm({
|
|
|
457
457
|
var CMS_VERSION;
|
|
458
458
|
var init_cms_version = __esm({
|
|
459
459
|
"src/lib/cms-version.ts"() {
|
|
460
|
-
CMS_VERSION = "1.0.
|
|
460
|
+
CMS_VERSION = "1.0.39" ;
|
|
461
461
|
}
|
|
462
462
|
});
|
|
463
463
|
function useCatalogCategories(enabled = true) {
|
package/dist/api.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkERJK5QXN_cjs = require('./chunk-ERJK5QXN.cjs');
|
|
4
4
|
require('./chunk-22FFHLTO.cjs');
|
|
5
5
|
require('./chunk-UCKN4BBY.cjs');
|
|
6
6
|
require('./chunk-7NMT3GBR.cjs');
|
|
@@ -20,127 +20,127 @@ require('./chunk-USNT2KNT.cjs');
|
|
|
20
20
|
|
|
21
21
|
Object.defineProperty(exports, "createAnalyticsHandlers", {
|
|
22
22
|
enumerable: true,
|
|
23
|
-
get: function () { return
|
|
23
|
+
get: function () { return chunkERJK5QXN_cjs.createAnalyticsHandlers; }
|
|
24
24
|
});
|
|
25
25
|
Object.defineProperty(exports, "createBlogBySlugHandler", {
|
|
26
26
|
enumerable: true,
|
|
27
|
-
get: function () { return
|
|
27
|
+
get: function () { return chunkERJK5QXN_cjs.createBlogBySlugHandler; }
|
|
28
28
|
});
|
|
29
29
|
Object.defineProperty(exports, "createChangePasswordHandler", {
|
|
30
30
|
enumerable: true,
|
|
31
|
-
get: function () { return
|
|
31
|
+
get: function () { return chunkERJK5QXN_cjs.createChangePasswordHandler; }
|
|
32
32
|
});
|
|
33
33
|
Object.defineProperty(exports, "createCmsApiHandler", {
|
|
34
34
|
enumerable: true,
|
|
35
|
-
get: function () { return
|
|
35
|
+
get: function () { return chunkERJK5QXN_cjs.createCmsApiHandler; }
|
|
36
36
|
});
|
|
37
37
|
Object.defineProperty(exports, "createCrudByIdHandler", {
|
|
38
38
|
enumerable: true,
|
|
39
|
-
get: function () { return
|
|
39
|
+
get: function () { return chunkERJK5QXN_cjs.createCrudByIdHandler; }
|
|
40
40
|
});
|
|
41
41
|
Object.defineProperty(exports, "createCrudHandler", {
|
|
42
42
|
enumerable: true,
|
|
43
|
-
get: function () { return
|
|
43
|
+
get: function () { return chunkERJK5QXN_cjs.createCrudHandler; }
|
|
44
44
|
});
|
|
45
45
|
Object.defineProperty(exports, "createDashboardStatsHandler", {
|
|
46
46
|
enumerable: true,
|
|
47
|
-
get: function () { return
|
|
47
|
+
get: function () { return chunkERJK5QXN_cjs.createDashboardStatsHandler; }
|
|
48
48
|
});
|
|
49
49
|
Object.defineProperty(exports, "createEcommerceAnalyticsHandler", {
|
|
50
50
|
enumerable: true,
|
|
51
|
-
get: function () { return
|
|
51
|
+
get: function () { return chunkERJK5QXN_cjs.createEcommerceAnalyticsHandler; }
|
|
52
52
|
});
|
|
53
53
|
Object.defineProperty(exports, "createForgotPasswordHandler", {
|
|
54
54
|
enumerable: true,
|
|
55
|
-
get: function () { return
|
|
55
|
+
get: function () { return chunkERJK5QXN_cjs.createForgotPasswordHandler; }
|
|
56
56
|
});
|
|
57
57
|
Object.defineProperty(exports, "createFormBySlugHandler", {
|
|
58
58
|
enumerable: true,
|
|
59
|
-
get: function () { return
|
|
59
|
+
get: function () { return chunkERJK5QXN_cjs.createFormBySlugHandler; }
|
|
60
60
|
});
|
|
61
61
|
Object.defineProperty(exports, "createInviteAcceptHandler", {
|
|
62
62
|
enumerable: true,
|
|
63
|
-
get: function () { return
|
|
63
|
+
get: function () { return chunkERJK5QXN_cjs.createInviteAcceptHandler; }
|
|
64
64
|
});
|
|
65
65
|
Object.defineProperty(exports, "createJobScheduleHandlers", {
|
|
66
66
|
enumerable: true,
|
|
67
|
-
get: function () { return
|
|
67
|
+
get: function () { return chunkERJK5QXN_cjs.createJobScheduleHandlers; }
|
|
68
68
|
});
|
|
69
69
|
Object.defineProperty(exports, "createLlmAgentKnowledgeHandlers", {
|
|
70
70
|
enumerable: true,
|
|
71
|
-
get: function () { return
|
|
71
|
+
get: function () { return chunkERJK5QXN_cjs.createLlmAgentKnowledgeHandlers; }
|
|
72
72
|
});
|
|
73
73
|
Object.defineProperty(exports, "createMediaZipExtractHandler", {
|
|
74
74
|
enumerable: true,
|
|
75
|
-
get: function () { return
|
|
75
|
+
get: function () { return chunkERJK5QXN_cjs.createMediaZipExtractHandler; }
|
|
76
76
|
});
|
|
77
77
|
Object.defineProperty(exports, "createSetPasswordHandler", {
|
|
78
78
|
enumerable: true,
|
|
79
|
-
get: function () { return
|
|
79
|
+
get: function () { return chunkERJK5QXN_cjs.createSetPasswordHandler; }
|
|
80
80
|
});
|
|
81
81
|
Object.defineProperty(exports, "createSettingsApiHandlers", {
|
|
82
82
|
enumerable: true,
|
|
83
|
-
get: function () { return
|
|
83
|
+
get: function () { return chunkERJK5QXN_cjs.createSettingsApiHandlers; }
|
|
84
84
|
});
|
|
85
85
|
Object.defineProperty(exports, "createStorefrontApiHandler", {
|
|
86
86
|
enumerable: true,
|
|
87
|
-
get: function () { return
|
|
87
|
+
get: function () { return chunkERJK5QXN_cjs.createStorefrontApiHandler; }
|
|
88
88
|
});
|
|
89
89
|
Object.defineProperty(exports, "createUploadHandler", {
|
|
90
90
|
enumerable: true,
|
|
91
|
-
get: function () { return
|
|
91
|
+
get: function () { return chunkERJK5QXN_cjs.createUploadHandler; }
|
|
92
92
|
});
|
|
93
93
|
Object.defineProperty(exports, "createUserAuthApiRouter", {
|
|
94
94
|
enumerable: true,
|
|
95
|
-
get: function () { return
|
|
95
|
+
get: function () { return chunkERJK5QXN_cjs.createUserAuthApiRouter; }
|
|
96
96
|
});
|
|
97
97
|
Object.defineProperty(exports, "createUserAvatarHandler", {
|
|
98
98
|
enumerable: true,
|
|
99
|
-
get: function () { return
|
|
99
|
+
get: function () { return chunkERJK5QXN_cjs.createUserAvatarHandler; }
|
|
100
100
|
});
|
|
101
101
|
Object.defineProperty(exports, "createUserProfileHandler", {
|
|
102
102
|
enumerable: true,
|
|
103
|
-
get: function () { return
|
|
103
|
+
get: function () { return chunkERJK5QXN_cjs.createUserProfileHandler; }
|
|
104
104
|
});
|
|
105
105
|
Object.defineProperty(exports, "createUsersApiHandlers", {
|
|
106
106
|
enumerable: true,
|
|
107
|
-
get: function () { return
|
|
107
|
+
get: function () { return chunkERJK5QXN_cjs.createUsersApiHandlers; }
|
|
108
108
|
});
|
|
109
109
|
Object.defineProperty(exports, "createVendorDashboardHandler", {
|
|
110
110
|
enumerable: true,
|
|
111
|
-
get: function () { return
|
|
111
|
+
get: function () { return chunkERJK5QXN_cjs.createVendorDashboardHandler; }
|
|
112
112
|
});
|
|
113
113
|
Object.defineProperty(exports, "createVendorOnboardHandlers", {
|
|
114
114
|
enumerable: true,
|
|
115
|
-
get: function () { return
|
|
115
|
+
get: function () { return chunkERJK5QXN_cjs.createVendorOnboardHandlers; }
|
|
116
116
|
});
|
|
117
117
|
Object.defineProperty(exports, "getPublicSettingsGroup", {
|
|
118
118
|
enumerable: true,
|
|
119
|
-
get: function () { return
|
|
119
|
+
get: function () { return chunkERJK5QXN_cjs.getPublicSettingsGroup; }
|
|
120
120
|
});
|
|
121
121
|
Object.defineProperty(exports, "mergeGuardrailsIntoSystemPrompt", {
|
|
122
122
|
enumerable: true,
|
|
123
|
-
get: function () { return
|
|
123
|
+
get: function () { return chunkERJK5QXN_cjs.mergeGuardrailsIntoSystemPrompt; }
|
|
124
124
|
});
|
|
125
125
|
Object.defineProperty(exports, "parseLlmAgentValidationRules", {
|
|
126
126
|
enumerable: true,
|
|
127
|
-
get: function () { return
|
|
127
|
+
get: function () { return chunkERJK5QXN_cjs.parseLlmAgentValidationRules; }
|
|
128
128
|
});
|
|
129
129
|
Object.defineProperty(exports, "simpleDecrypt", {
|
|
130
130
|
enumerable: true,
|
|
131
|
-
get: function () { return
|
|
131
|
+
get: function () { return chunkERJK5QXN_cjs.simpleDecrypt; }
|
|
132
132
|
});
|
|
133
133
|
Object.defineProperty(exports, "simpleEncrypt", {
|
|
134
134
|
enumerable: true,
|
|
135
|
-
get: function () { return
|
|
135
|
+
get: function () { return chunkERJK5QXN_cjs.simpleEncrypt; }
|
|
136
136
|
});
|
|
137
137
|
Object.defineProperty(exports, "validateUserMessageAgainstAgentRules", {
|
|
138
138
|
enumerable: true,
|
|
139
|
-
get: function () { return
|
|
139
|
+
get: function () { return chunkERJK5QXN_cjs.validateUserMessageAgainstAgentRules; }
|
|
140
140
|
});
|
|
141
141
|
Object.defineProperty(exports, "validateUserMessageAgainstStructuredRules", {
|
|
142
142
|
enumerable: true,
|
|
143
|
-
get: function () { return
|
|
143
|
+
get: function () { return chunkERJK5QXN_cjs.validateUserMessageAgainstStructuredRules; }
|
|
144
144
|
});
|
|
145
145
|
Object.defineProperty(exports, "createCmsAuthBundle", {
|
|
146
146
|
enumerable: true,
|
package/dist/api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createSetPasswordHandler, createSettingsApiHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, getPublicSettingsGroup, mergeGuardrailsIntoSystemPrompt, parseLlmAgentValidationRules, simpleDecrypt, simpleEncrypt, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules } from './chunk-
|
|
1
|
+
export { createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createSetPasswordHandler, createSettingsApiHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, getPublicSettingsGroup, mergeGuardrailsIntoSystemPrompt, parseLlmAgentValidationRules, simpleDecrypt, simpleEncrypt, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules } from './chunk-SFDZMGHD.js';
|
|
2
2
|
import './chunk-NNQBWDCI.js';
|
|
3
3
|
import './chunk-HCIRL37O.js';
|
|
4
4
|
import './chunk-JXF23MPG.js';
|
|
@@ -11821,6 +11821,84 @@ function slugify(input) {
|
|
|
11821
11821
|
return input.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 80);
|
|
11822
11822
|
}
|
|
11823
11823
|
chunkUSNT2KNT_cjs.__name(slugify, "slugify");
|
|
11824
|
+
function vendorOnboardErrorResponse(json, err) {
|
|
11825
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
11826
|
+
console.error("[vendor-onboard]", err);
|
|
11827
|
+
if (msg === "VENDOR_SLUG_EXISTS") {
|
|
11828
|
+
return json({
|
|
11829
|
+
error: "Vendor slug already exists"
|
|
11830
|
+
}, {
|
|
11831
|
+
status: 400
|
|
11832
|
+
});
|
|
11833
|
+
}
|
|
11834
|
+
if (msg === "USER_EMAIL_EXISTS") {
|
|
11835
|
+
return json({
|
|
11836
|
+
error: "User with this email already exists"
|
|
11837
|
+
}, {
|
|
11838
|
+
status: 400
|
|
11839
|
+
});
|
|
11840
|
+
}
|
|
11841
|
+
if (msg === "VENDOR_OWNER_GROUP_MISSING") {
|
|
11842
|
+
return json({
|
|
11843
|
+
error: "Vendor Owner group not found. Run migrations (VendorOwnerRbacSeed)."
|
|
11844
|
+
}, {
|
|
11845
|
+
status: 500
|
|
11846
|
+
});
|
|
11847
|
+
}
|
|
11848
|
+
if (msg === "VENDOR_ROLES_SEED_FAILED") {
|
|
11849
|
+
return json({
|
|
11850
|
+
error: "Failed to seed store roles for vendor. Run migrations."
|
|
11851
|
+
}, {
|
|
11852
|
+
status: 500
|
|
11853
|
+
});
|
|
11854
|
+
}
|
|
11855
|
+
if (/vendor_roles|vendor_role_permissions/i.test(msg)) {
|
|
11856
|
+
return json({
|
|
11857
|
+
error: "Vendor roles tables missing. Run migrations."
|
|
11858
|
+
}, {
|
|
11859
|
+
status: 500
|
|
11860
|
+
});
|
|
11861
|
+
}
|
|
11862
|
+
if (/relation .* does not exist|column .* does not exist/i.test(msg)) {
|
|
11863
|
+
return json({
|
|
11864
|
+
error: "Database schema is outdated on this environment. Run migrations.",
|
|
11865
|
+
detail: msg
|
|
11866
|
+
}, {
|
|
11867
|
+
status: 500
|
|
11868
|
+
});
|
|
11869
|
+
}
|
|
11870
|
+
if (/duplicate key|unique constraint/i.test(msg)) {
|
|
11871
|
+
if (/email/i.test(msg)) {
|
|
11872
|
+
return json({
|
|
11873
|
+
error: "A user or record with this email already exists",
|
|
11874
|
+
detail: msg
|
|
11875
|
+
}, {
|
|
11876
|
+
status: 409
|
|
11877
|
+
});
|
|
11878
|
+
}
|
|
11879
|
+
if (/slug/i.test(msg)) {
|
|
11880
|
+
return json({
|
|
11881
|
+
error: "Vendor slug already exists",
|
|
11882
|
+
detail: msg
|
|
11883
|
+
}, {
|
|
11884
|
+
status: 409
|
|
11885
|
+
});
|
|
11886
|
+
}
|
|
11887
|
+
return json({
|
|
11888
|
+
error: "Duplicate value conflicts with an existing record",
|
|
11889
|
+
detail: msg
|
|
11890
|
+
}, {
|
|
11891
|
+
status: 409
|
|
11892
|
+
});
|
|
11893
|
+
}
|
|
11894
|
+
return json({
|
|
11895
|
+
error: "Server error",
|
|
11896
|
+
detail: msg
|
|
11897
|
+
}, {
|
|
11898
|
+
status: 500
|
|
11899
|
+
});
|
|
11900
|
+
}
|
|
11901
|
+
chunkUSNT2KNT_cjs.__name(vendorOnboardErrorResponse, "vendorOnboardErrorResponse");
|
|
11824
11902
|
function createVendorOnboardHandlers(config) {
|
|
11825
11903
|
const { dataSource, entityMap, json, getSessionUser, baseUrl, getCms, hashPassword, minPasswordLength = 6 } = config;
|
|
11826
11904
|
async function gateAdmin() {
|
|
@@ -11989,12 +12067,28 @@ function createVendorOnboardHandlers(config) {
|
|
|
11989
12067
|
}
|
|
11990
12068
|
});
|
|
11991
12069
|
if (dupVendor) throw new Error("VENDOR_SLUG_EXISTS");
|
|
11992
|
-
|
|
12070
|
+
let ownerGroup = await groupRepo.findOne({
|
|
11993
12071
|
where: {
|
|
11994
12072
|
name: chunkWMXPKKXU_cjs.VENDOR_OWNER_GROUP_NAME,
|
|
11995
12073
|
deleted: false
|
|
11996
12074
|
}
|
|
11997
12075
|
});
|
|
12076
|
+
if (!ownerGroup) {
|
|
12077
|
+
try {
|
|
12078
|
+
await groupRepo.save(groupRepo.create({
|
|
12079
|
+
name: chunkWMXPKKXU_cjs.VENDOR_OWNER_GROUP_NAME,
|
|
12080
|
+
deleted: false
|
|
12081
|
+
}));
|
|
12082
|
+
ownerGroup = await groupRepo.findOne({
|
|
12083
|
+
where: {
|
|
12084
|
+
name: chunkWMXPKKXU_cjs.VENDOR_OWNER_GROUP_NAME,
|
|
12085
|
+
deleted: false
|
|
12086
|
+
}
|
|
12087
|
+
});
|
|
12088
|
+
} catch (seedErr) {
|
|
12089
|
+
console.error("[vendor-onboard] failed to seed Vendor Owner group", seedErr);
|
|
12090
|
+
}
|
|
12091
|
+
}
|
|
11998
12092
|
if (!ownerGroup) throw new Error("VENDOR_OWNER_GROUP_MISSING");
|
|
11999
12093
|
const existingUser = await userRepo.findOne({
|
|
12000
12094
|
where: {
|
|
@@ -12083,14 +12177,18 @@ function createVendorOnboardHandlers(config) {
|
|
|
12083
12177
|
});
|
|
12084
12178
|
}
|
|
12085
12179
|
if (entityMap.customer) {
|
|
12086
|
-
|
|
12087
|
-
|
|
12088
|
-
|
|
12089
|
-
|
|
12090
|
-
|
|
12091
|
-
|
|
12092
|
-
|
|
12093
|
-
|
|
12180
|
+
try {
|
|
12181
|
+
await ensureCustomerForUser(em, entityMap.customer, {
|
|
12182
|
+
id: newUser.id,
|
|
12183
|
+
name: userName,
|
|
12184
|
+
email: userEmail,
|
|
12185
|
+
phone: trimOrNull(body.vendor?.phone) ?? ownerPhone
|
|
12186
|
+
}, {
|
|
12187
|
+
phone: trimOrNull(body.vendor?.phone) ?? ownerPhone
|
|
12188
|
+
});
|
|
12189
|
+
} catch (customerErr) {
|
|
12190
|
+
console.error("[vendor-onboard] ensureCustomerForUser skipped", customerErr);
|
|
12191
|
+
}
|
|
12094
12192
|
}
|
|
12095
12193
|
return {
|
|
12096
12194
|
vendor,
|
|
@@ -12140,46 +12238,7 @@ function createVendorOnboardHandlers(config) {
|
|
|
12140
12238
|
status: 201
|
|
12141
12239
|
});
|
|
12142
12240
|
} catch (e) {
|
|
12143
|
-
|
|
12144
|
-
if (process.env.NODE_ENV === "development") {
|
|
12145
|
-
console.error("[vendor-onboard]", e);
|
|
12146
|
-
}
|
|
12147
|
-
if (msg === "VENDOR_SLUG_EXISTS") return json({
|
|
12148
|
-
error: "Vendor slug already exists"
|
|
12149
|
-
}, {
|
|
12150
|
-
status: 400
|
|
12151
|
-
});
|
|
12152
|
-
if (msg === "USER_EMAIL_EXISTS") return json({
|
|
12153
|
-
error: "User with this email already exists"
|
|
12154
|
-
}, {
|
|
12155
|
-
status: 400
|
|
12156
|
-
});
|
|
12157
|
-
if (msg === "VENDOR_OWNER_GROUP_MISSING") {
|
|
12158
|
-
return json({
|
|
12159
|
-
error: "Vendor Owner group not found. Run migrations."
|
|
12160
|
-
}, {
|
|
12161
|
-
status: 500
|
|
12162
|
-
});
|
|
12163
|
-
}
|
|
12164
|
-
if (msg === "VENDOR_ROLES_SEED_FAILED") {
|
|
12165
|
-
return json({
|
|
12166
|
-
error: "Failed to seed store roles for vendor. Run migrations."
|
|
12167
|
-
}, {
|
|
12168
|
-
status: 500
|
|
12169
|
-
});
|
|
12170
|
-
}
|
|
12171
|
-
if (/vendor_roles|vendor_role_permissions/i.test(msg)) {
|
|
12172
|
-
return json({
|
|
12173
|
-
error: "Vendor roles tables missing. Run migrations."
|
|
12174
|
-
}, {
|
|
12175
|
-
status: 500
|
|
12176
|
-
});
|
|
12177
|
-
}
|
|
12178
|
-
return json({
|
|
12179
|
-
error: "Server error"
|
|
12180
|
-
}, {
|
|
12181
|
-
status: 500
|
|
12182
|
-
});
|
|
12241
|
+
return vendorOnboardErrorResponse(json, e);
|
|
12183
12242
|
}
|
|
12184
12243
|
},
|
|
12185
12244
|
/** POST /api/admin/vendor/switch — set active vendor in session (JWT update via client) */
|
|
@@ -11811,6 +11811,84 @@ function slugify(input) {
|
|
|
11811
11811
|
return input.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 80);
|
|
11812
11812
|
}
|
|
11813
11813
|
__name(slugify, "slugify");
|
|
11814
|
+
function vendorOnboardErrorResponse(json, err) {
|
|
11815
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
11816
|
+
console.error("[vendor-onboard]", err);
|
|
11817
|
+
if (msg === "VENDOR_SLUG_EXISTS") {
|
|
11818
|
+
return json({
|
|
11819
|
+
error: "Vendor slug already exists"
|
|
11820
|
+
}, {
|
|
11821
|
+
status: 400
|
|
11822
|
+
});
|
|
11823
|
+
}
|
|
11824
|
+
if (msg === "USER_EMAIL_EXISTS") {
|
|
11825
|
+
return json({
|
|
11826
|
+
error: "User with this email already exists"
|
|
11827
|
+
}, {
|
|
11828
|
+
status: 400
|
|
11829
|
+
});
|
|
11830
|
+
}
|
|
11831
|
+
if (msg === "VENDOR_OWNER_GROUP_MISSING") {
|
|
11832
|
+
return json({
|
|
11833
|
+
error: "Vendor Owner group not found. Run migrations (VendorOwnerRbacSeed)."
|
|
11834
|
+
}, {
|
|
11835
|
+
status: 500
|
|
11836
|
+
});
|
|
11837
|
+
}
|
|
11838
|
+
if (msg === "VENDOR_ROLES_SEED_FAILED") {
|
|
11839
|
+
return json({
|
|
11840
|
+
error: "Failed to seed store roles for vendor. Run migrations."
|
|
11841
|
+
}, {
|
|
11842
|
+
status: 500
|
|
11843
|
+
});
|
|
11844
|
+
}
|
|
11845
|
+
if (/vendor_roles|vendor_role_permissions/i.test(msg)) {
|
|
11846
|
+
return json({
|
|
11847
|
+
error: "Vendor roles tables missing. Run migrations."
|
|
11848
|
+
}, {
|
|
11849
|
+
status: 500
|
|
11850
|
+
});
|
|
11851
|
+
}
|
|
11852
|
+
if (/relation .* does not exist|column .* does not exist/i.test(msg)) {
|
|
11853
|
+
return json({
|
|
11854
|
+
error: "Database schema is outdated on this environment. Run migrations.",
|
|
11855
|
+
detail: msg
|
|
11856
|
+
}, {
|
|
11857
|
+
status: 500
|
|
11858
|
+
});
|
|
11859
|
+
}
|
|
11860
|
+
if (/duplicate key|unique constraint/i.test(msg)) {
|
|
11861
|
+
if (/email/i.test(msg)) {
|
|
11862
|
+
return json({
|
|
11863
|
+
error: "A user or record with this email already exists",
|
|
11864
|
+
detail: msg
|
|
11865
|
+
}, {
|
|
11866
|
+
status: 409
|
|
11867
|
+
});
|
|
11868
|
+
}
|
|
11869
|
+
if (/slug/i.test(msg)) {
|
|
11870
|
+
return json({
|
|
11871
|
+
error: "Vendor slug already exists",
|
|
11872
|
+
detail: msg
|
|
11873
|
+
}, {
|
|
11874
|
+
status: 409
|
|
11875
|
+
});
|
|
11876
|
+
}
|
|
11877
|
+
return json({
|
|
11878
|
+
error: "Duplicate value conflicts with an existing record",
|
|
11879
|
+
detail: msg
|
|
11880
|
+
}, {
|
|
11881
|
+
status: 409
|
|
11882
|
+
});
|
|
11883
|
+
}
|
|
11884
|
+
return json({
|
|
11885
|
+
error: "Server error",
|
|
11886
|
+
detail: msg
|
|
11887
|
+
}, {
|
|
11888
|
+
status: 500
|
|
11889
|
+
});
|
|
11890
|
+
}
|
|
11891
|
+
__name(vendorOnboardErrorResponse, "vendorOnboardErrorResponse");
|
|
11814
11892
|
function createVendorOnboardHandlers(config) {
|
|
11815
11893
|
const { dataSource, entityMap, json, getSessionUser, baseUrl, getCms, hashPassword, minPasswordLength = 6 } = config;
|
|
11816
11894
|
async function gateAdmin() {
|
|
@@ -11979,12 +12057,28 @@ function createVendorOnboardHandlers(config) {
|
|
|
11979
12057
|
}
|
|
11980
12058
|
});
|
|
11981
12059
|
if (dupVendor) throw new Error("VENDOR_SLUG_EXISTS");
|
|
11982
|
-
|
|
12060
|
+
let ownerGroup = await groupRepo.findOne({
|
|
11983
12061
|
where: {
|
|
11984
12062
|
name: VENDOR_OWNER_GROUP_NAME,
|
|
11985
12063
|
deleted: false
|
|
11986
12064
|
}
|
|
11987
12065
|
});
|
|
12066
|
+
if (!ownerGroup) {
|
|
12067
|
+
try {
|
|
12068
|
+
await groupRepo.save(groupRepo.create({
|
|
12069
|
+
name: VENDOR_OWNER_GROUP_NAME,
|
|
12070
|
+
deleted: false
|
|
12071
|
+
}));
|
|
12072
|
+
ownerGroup = await groupRepo.findOne({
|
|
12073
|
+
where: {
|
|
12074
|
+
name: VENDOR_OWNER_GROUP_NAME,
|
|
12075
|
+
deleted: false
|
|
12076
|
+
}
|
|
12077
|
+
});
|
|
12078
|
+
} catch (seedErr) {
|
|
12079
|
+
console.error("[vendor-onboard] failed to seed Vendor Owner group", seedErr);
|
|
12080
|
+
}
|
|
12081
|
+
}
|
|
11988
12082
|
if (!ownerGroup) throw new Error("VENDOR_OWNER_GROUP_MISSING");
|
|
11989
12083
|
const existingUser = await userRepo.findOne({
|
|
11990
12084
|
where: {
|
|
@@ -12073,14 +12167,18 @@ function createVendorOnboardHandlers(config) {
|
|
|
12073
12167
|
});
|
|
12074
12168
|
}
|
|
12075
12169
|
if (entityMap.customer) {
|
|
12076
|
-
|
|
12077
|
-
|
|
12078
|
-
|
|
12079
|
-
|
|
12080
|
-
|
|
12081
|
-
|
|
12082
|
-
|
|
12083
|
-
|
|
12170
|
+
try {
|
|
12171
|
+
await ensureCustomerForUser(em, entityMap.customer, {
|
|
12172
|
+
id: newUser.id,
|
|
12173
|
+
name: userName,
|
|
12174
|
+
email: userEmail,
|
|
12175
|
+
phone: trimOrNull(body.vendor?.phone) ?? ownerPhone
|
|
12176
|
+
}, {
|
|
12177
|
+
phone: trimOrNull(body.vendor?.phone) ?? ownerPhone
|
|
12178
|
+
});
|
|
12179
|
+
} catch (customerErr) {
|
|
12180
|
+
console.error("[vendor-onboard] ensureCustomerForUser skipped", customerErr);
|
|
12181
|
+
}
|
|
12084
12182
|
}
|
|
12085
12183
|
return {
|
|
12086
12184
|
vendor,
|
|
@@ -12130,46 +12228,7 @@ function createVendorOnboardHandlers(config) {
|
|
|
12130
12228
|
status: 201
|
|
12131
12229
|
});
|
|
12132
12230
|
} catch (e) {
|
|
12133
|
-
|
|
12134
|
-
if (process.env.NODE_ENV === "development") {
|
|
12135
|
-
console.error("[vendor-onboard]", e);
|
|
12136
|
-
}
|
|
12137
|
-
if (msg === "VENDOR_SLUG_EXISTS") return json({
|
|
12138
|
-
error: "Vendor slug already exists"
|
|
12139
|
-
}, {
|
|
12140
|
-
status: 400
|
|
12141
|
-
});
|
|
12142
|
-
if (msg === "USER_EMAIL_EXISTS") return json({
|
|
12143
|
-
error: "User with this email already exists"
|
|
12144
|
-
}, {
|
|
12145
|
-
status: 400
|
|
12146
|
-
});
|
|
12147
|
-
if (msg === "VENDOR_OWNER_GROUP_MISSING") {
|
|
12148
|
-
return json({
|
|
12149
|
-
error: "Vendor Owner group not found. Run migrations."
|
|
12150
|
-
}, {
|
|
12151
|
-
status: 500
|
|
12152
|
-
});
|
|
12153
|
-
}
|
|
12154
|
-
if (msg === "VENDOR_ROLES_SEED_FAILED") {
|
|
12155
|
-
return json({
|
|
12156
|
-
error: "Failed to seed store roles for vendor. Run migrations."
|
|
12157
|
-
}, {
|
|
12158
|
-
status: 500
|
|
12159
|
-
});
|
|
12160
|
-
}
|
|
12161
|
-
if (/vendor_roles|vendor_role_permissions/i.test(msg)) {
|
|
12162
|
-
return json({
|
|
12163
|
-
error: "Vendor roles tables missing. Run migrations."
|
|
12164
|
-
}, {
|
|
12165
|
-
status: 500
|
|
12166
|
-
});
|
|
12167
|
-
}
|
|
12168
|
-
return json({
|
|
12169
|
-
error: "Server error"
|
|
12170
|
-
}, {
|
|
12171
|
-
status: 500
|
|
12172
|
-
});
|
|
12231
|
+
return vendorOnboardErrorResponse(json, e);
|
|
12173
12232
|
}
|
|
12174
12233
|
},
|
|
12175
12234
|
/** POST /api/admin/vendor/switch — set active vendor in session (JWT update via client) */
|