@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 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.38" ;
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.38" ;
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 chunkVJDUKAJ3_cjs = require('./chunk-VJDUKAJ3.cjs');
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 chunkVJDUKAJ3_cjs.createAnalyticsHandlers; }
23
+ get: function () { return chunkERJK5QXN_cjs.createAnalyticsHandlers; }
24
24
  });
25
25
  Object.defineProperty(exports, "createBlogBySlugHandler", {
26
26
  enumerable: true,
27
- get: function () { return chunkVJDUKAJ3_cjs.createBlogBySlugHandler; }
27
+ get: function () { return chunkERJK5QXN_cjs.createBlogBySlugHandler; }
28
28
  });
29
29
  Object.defineProperty(exports, "createChangePasswordHandler", {
30
30
  enumerable: true,
31
- get: function () { return chunkVJDUKAJ3_cjs.createChangePasswordHandler; }
31
+ get: function () { return chunkERJK5QXN_cjs.createChangePasswordHandler; }
32
32
  });
33
33
  Object.defineProperty(exports, "createCmsApiHandler", {
34
34
  enumerable: true,
35
- get: function () { return chunkVJDUKAJ3_cjs.createCmsApiHandler; }
35
+ get: function () { return chunkERJK5QXN_cjs.createCmsApiHandler; }
36
36
  });
37
37
  Object.defineProperty(exports, "createCrudByIdHandler", {
38
38
  enumerable: true,
39
- get: function () { return chunkVJDUKAJ3_cjs.createCrudByIdHandler; }
39
+ get: function () { return chunkERJK5QXN_cjs.createCrudByIdHandler; }
40
40
  });
41
41
  Object.defineProperty(exports, "createCrudHandler", {
42
42
  enumerable: true,
43
- get: function () { return chunkVJDUKAJ3_cjs.createCrudHandler; }
43
+ get: function () { return chunkERJK5QXN_cjs.createCrudHandler; }
44
44
  });
45
45
  Object.defineProperty(exports, "createDashboardStatsHandler", {
46
46
  enumerable: true,
47
- get: function () { return chunkVJDUKAJ3_cjs.createDashboardStatsHandler; }
47
+ get: function () { return chunkERJK5QXN_cjs.createDashboardStatsHandler; }
48
48
  });
49
49
  Object.defineProperty(exports, "createEcommerceAnalyticsHandler", {
50
50
  enumerable: true,
51
- get: function () { return chunkVJDUKAJ3_cjs.createEcommerceAnalyticsHandler; }
51
+ get: function () { return chunkERJK5QXN_cjs.createEcommerceAnalyticsHandler; }
52
52
  });
53
53
  Object.defineProperty(exports, "createForgotPasswordHandler", {
54
54
  enumerable: true,
55
- get: function () { return chunkVJDUKAJ3_cjs.createForgotPasswordHandler; }
55
+ get: function () { return chunkERJK5QXN_cjs.createForgotPasswordHandler; }
56
56
  });
57
57
  Object.defineProperty(exports, "createFormBySlugHandler", {
58
58
  enumerable: true,
59
- get: function () { return chunkVJDUKAJ3_cjs.createFormBySlugHandler; }
59
+ get: function () { return chunkERJK5QXN_cjs.createFormBySlugHandler; }
60
60
  });
61
61
  Object.defineProperty(exports, "createInviteAcceptHandler", {
62
62
  enumerable: true,
63
- get: function () { return chunkVJDUKAJ3_cjs.createInviteAcceptHandler; }
63
+ get: function () { return chunkERJK5QXN_cjs.createInviteAcceptHandler; }
64
64
  });
65
65
  Object.defineProperty(exports, "createJobScheduleHandlers", {
66
66
  enumerable: true,
67
- get: function () { return chunkVJDUKAJ3_cjs.createJobScheduleHandlers; }
67
+ get: function () { return chunkERJK5QXN_cjs.createJobScheduleHandlers; }
68
68
  });
69
69
  Object.defineProperty(exports, "createLlmAgentKnowledgeHandlers", {
70
70
  enumerable: true,
71
- get: function () { return chunkVJDUKAJ3_cjs.createLlmAgentKnowledgeHandlers; }
71
+ get: function () { return chunkERJK5QXN_cjs.createLlmAgentKnowledgeHandlers; }
72
72
  });
73
73
  Object.defineProperty(exports, "createMediaZipExtractHandler", {
74
74
  enumerable: true,
75
- get: function () { return chunkVJDUKAJ3_cjs.createMediaZipExtractHandler; }
75
+ get: function () { return chunkERJK5QXN_cjs.createMediaZipExtractHandler; }
76
76
  });
77
77
  Object.defineProperty(exports, "createSetPasswordHandler", {
78
78
  enumerable: true,
79
- get: function () { return chunkVJDUKAJ3_cjs.createSetPasswordHandler; }
79
+ get: function () { return chunkERJK5QXN_cjs.createSetPasswordHandler; }
80
80
  });
81
81
  Object.defineProperty(exports, "createSettingsApiHandlers", {
82
82
  enumerable: true,
83
- get: function () { return chunkVJDUKAJ3_cjs.createSettingsApiHandlers; }
83
+ get: function () { return chunkERJK5QXN_cjs.createSettingsApiHandlers; }
84
84
  });
85
85
  Object.defineProperty(exports, "createStorefrontApiHandler", {
86
86
  enumerable: true,
87
- get: function () { return chunkVJDUKAJ3_cjs.createStorefrontApiHandler; }
87
+ get: function () { return chunkERJK5QXN_cjs.createStorefrontApiHandler; }
88
88
  });
89
89
  Object.defineProperty(exports, "createUploadHandler", {
90
90
  enumerable: true,
91
- get: function () { return chunkVJDUKAJ3_cjs.createUploadHandler; }
91
+ get: function () { return chunkERJK5QXN_cjs.createUploadHandler; }
92
92
  });
93
93
  Object.defineProperty(exports, "createUserAuthApiRouter", {
94
94
  enumerable: true,
95
- get: function () { return chunkVJDUKAJ3_cjs.createUserAuthApiRouter; }
95
+ get: function () { return chunkERJK5QXN_cjs.createUserAuthApiRouter; }
96
96
  });
97
97
  Object.defineProperty(exports, "createUserAvatarHandler", {
98
98
  enumerable: true,
99
- get: function () { return chunkVJDUKAJ3_cjs.createUserAvatarHandler; }
99
+ get: function () { return chunkERJK5QXN_cjs.createUserAvatarHandler; }
100
100
  });
101
101
  Object.defineProperty(exports, "createUserProfileHandler", {
102
102
  enumerable: true,
103
- get: function () { return chunkVJDUKAJ3_cjs.createUserProfileHandler; }
103
+ get: function () { return chunkERJK5QXN_cjs.createUserProfileHandler; }
104
104
  });
105
105
  Object.defineProperty(exports, "createUsersApiHandlers", {
106
106
  enumerable: true,
107
- get: function () { return chunkVJDUKAJ3_cjs.createUsersApiHandlers; }
107
+ get: function () { return chunkERJK5QXN_cjs.createUsersApiHandlers; }
108
108
  });
109
109
  Object.defineProperty(exports, "createVendorDashboardHandler", {
110
110
  enumerable: true,
111
- get: function () { return chunkVJDUKAJ3_cjs.createVendorDashboardHandler; }
111
+ get: function () { return chunkERJK5QXN_cjs.createVendorDashboardHandler; }
112
112
  });
113
113
  Object.defineProperty(exports, "createVendorOnboardHandlers", {
114
114
  enumerable: true,
115
- get: function () { return chunkVJDUKAJ3_cjs.createVendorOnboardHandlers; }
115
+ get: function () { return chunkERJK5QXN_cjs.createVendorOnboardHandlers; }
116
116
  });
117
117
  Object.defineProperty(exports, "getPublicSettingsGroup", {
118
118
  enumerable: true,
119
- get: function () { return chunkVJDUKAJ3_cjs.getPublicSettingsGroup; }
119
+ get: function () { return chunkERJK5QXN_cjs.getPublicSettingsGroup; }
120
120
  });
121
121
  Object.defineProperty(exports, "mergeGuardrailsIntoSystemPrompt", {
122
122
  enumerable: true,
123
- get: function () { return chunkVJDUKAJ3_cjs.mergeGuardrailsIntoSystemPrompt; }
123
+ get: function () { return chunkERJK5QXN_cjs.mergeGuardrailsIntoSystemPrompt; }
124
124
  });
125
125
  Object.defineProperty(exports, "parseLlmAgentValidationRules", {
126
126
  enumerable: true,
127
- get: function () { return chunkVJDUKAJ3_cjs.parseLlmAgentValidationRules; }
127
+ get: function () { return chunkERJK5QXN_cjs.parseLlmAgentValidationRules; }
128
128
  });
129
129
  Object.defineProperty(exports, "simpleDecrypt", {
130
130
  enumerable: true,
131
- get: function () { return chunkVJDUKAJ3_cjs.simpleDecrypt; }
131
+ get: function () { return chunkERJK5QXN_cjs.simpleDecrypt; }
132
132
  });
133
133
  Object.defineProperty(exports, "simpleEncrypt", {
134
134
  enumerable: true,
135
- get: function () { return chunkVJDUKAJ3_cjs.simpleEncrypt; }
135
+ get: function () { return chunkERJK5QXN_cjs.simpleEncrypt; }
136
136
  });
137
137
  Object.defineProperty(exports, "validateUserMessageAgainstAgentRules", {
138
138
  enumerable: true,
139
- get: function () { return chunkVJDUKAJ3_cjs.validateUserMessageAgainstAgentRules; }
139
+ get: function () { return chunkERJK5QXN_cjs.validateUserMessageAgainstAgentRules; }
140
140
  });
141
141
  Object.defineProperty(exports, "validateUserMessageAgainstStructuredRules", {
142
142
  enumerable: true,
143
- get: function () { return chunkVJDUKAJ3_cjs.validateUserMessageAgainstStructuredRules; }
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-PYUXVU75.js';
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
- const ownerGroup = await groupRepo.findOne({
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
- await ensureCustomerForUser(em, entityMap.customer, {
12087
- id: newUser.id,
12088
- name: userName,
12089
- email: userEmail,
12090
- phone: trimOrNull(body.vendor?.phone) ?? ownerPhone
12091
- }, {
12092
- phone: trimOrNull(body.vendor?.phone) ?? ownerPhone
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
- const msg = e instanceof Error ? e.message : String(e);
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
- const ownerGroup = await groupRepo.findOne({
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
- await ensureCustomerForUser(em, entityMap.customer, {
12077
- id: newUser.id,
12078
- name: userName,
12079
- email: userEmail,
12080
- phone: trimOrNull(body.vendor?.phone) ?? ownerPhone
12081
- }, {
12082
- phone: trimOrNull(body.vendor?.phone) ?? ownerPhone
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
- const msg = e instanceof Error ? e.message : String(e);
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) */