@infuro/cms-core 1.0.60 → 1.0.61

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/api.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkBSLNXKV2_cjs = require('./chunk-BSLNXKV2.cjs');
3
+ var chunkCNAHVRRU_cjs = require('./chunk-CNAHVRRU.cjs');
4
4
  require('./chunk-XQ3QUHWR.cjs');
5
5
  require('./chunk-HY3AXLOI.cjs');
6
6
  require('./chunk-YSYX4GUD.cjs');
@@ -22,131 +22,131 @@ require('./chunk-USNT2KNT.cjs');
22
22
 
23
23
  Object.defineProperty(exports, "autoExpireOrderIfPaymentTimeExceeded", {
24
24
  enumerable: true,
25
- get: function () { return chunkBSLNXKV2_cjs.autoExpireOrderIfPaymentTimeExceeded; }
25
+ get: function () { return chunkCNAHVRRU_cjs.autoExpireOrderIfPaymentTimeExceeded; }
26
26
  });
27
27
  Object.defineProperty(exports, "createAnalyticsHandlers", {
28
28
  enumerable: true,
29
- get: function () { return chunkBSLNXKV2_cjs.createAnalyticsHandlers; }
29
+ get: function () { return chunkCNAHVRRU_cjs.createAnalyticsHandlers; }
30
30
  });
31
31
  Object.defineProperty(exports, "createBlogBySlugHandler", {
32
32
  enumerable: true,
33
- get: function () { return chunkBSLNXKV2_cjs.createBlogBySlugHandler; }
33
+ get: function () { return chunkCNAHVRRU_cjs.createBlogBySlugHandler; }
34
34
  });
35
35
  Object.defineProperty(exports, "createChangePasswordHandler", {
36
36
  enumerable: true,
37
- get: function () { return chunkBSLNXKV2_cjs.createChangePasswordHandler; }
37
+ get: function () { return chunkCNAHVRRU_cjs.createChangePasswordHandler; }
38
38
  });
39
39
  Object.defineProperty(exports, "createCmsApiHandler", {
40
40
  enumerable: true,
41
- get: function () { return chunkBSLNXKV2_cjs.createCmsApiHandler; }
41
+ get: function () { return chunkCNAHVRRU_cjs.createCmsApiHandler; }
42
42
  });
43
43
  Object.defineProperty(exports, "createCrudByIdHandler", {
44
44
  enumerable: true,
45
- get: function () { return chunkBSLNXKV2_cjs.createCrudByIdHandler; }
45
+ get: function () { return chunkCNAHVRRU_cjs.createCrudByIdHandler; }
46
46
  });
47
47
  Object.defineProperty(exports, "createCrudHandler", {
48
48
  enumerable: true,
49
- get: function () { return chunkBSLNXKV2_cjs.createCrudHandler; }
49
+ get: function () { return chunkCNAHVRRU_cjs.createCrudHandler; }
50
50
  });
51
51
  Object.defineProperty(exports, "createDashboardStatsHandler", {
52
52
  enumerable: true,
53
- get: function () { return chunkBSLNXKV2_cjs.createDashboardStatsHandler; }
53
+ get: function () { return chunkCNAHVRRU_cjs.createDashboardStatsHandler; }
54
54
  });
55
55
  Object.defineProperty(exports, "createEcommerceAnalyticsHandler", {
56
56
  enumerable: true,
57
- get: function () { return chunkBSLNXKV2_cjs.createEcommerceAnalyticsHandler; }
57
+ get: function () { return chunkCNAHVRRU_cjs.createEcommerceAnalyticsHandler; }
58
58
  });
59
59
  Object.defineProperty(exports, "createForgotPasswordHandler", {
60
60
  enumerable: true,
61
- get: function () { return chunkBSLNXKV2_cjs.createForgotPasswordHandler; }
61
+ get: function () { return chunkCNAHVRRU_cjs.createForgotPasswordHandler; }
62
62
  });
63
63
  Object.defineProperty(exports, "createFormBySlugHandler", {
64
64
  enumerable: true,
65
- get: function () { return chunkBSLNXKV2_cjs.createFormBySlugHandler; }
65
+ get: function () { return chunkCNAHVRRU_cjs.createFormBySlugHandler; }
66
66
  });
67
67
  Object.defineProperty(exports, "createInviteAcceptHandler", {
68
68
  enumerable: true,
69
- get: function () { return chunkBSLNXKV2_cjs.createInviteAcceptHandler; }
69
+ get: function () { return chunkCNAHVRRU_cjs.createInviteAcceptHandler; }
70
70
  });
71
71
  Object.defineProperty(exports, "createJobScheduleHandlers", {
72
72
  enumerable: true,
73
- get: function () { return chunkBSLNXKV2_cjs.createJobScheduleHandlers; }
73
+ get: function () { return chunkCNAHVRRU_cjs.createJobScheduleHandlers; }
74
74
  });
75
75
  Object.defineProperty(exports, "createLlmAgentKnowledgeHandlers", {
76
76
  enumerable: true,
77
- get: function () { return chunkBSLNXKV2_cjs.createLlmAgentKnowledgeHandlers; }
77
+ get: function () { return chunkCNAHVRRU_cjs.createLlmAgentKnowledgeHandlers; }
78
78
  });
79
79
  Object.defineProperty(exports, "createMediaZipExtractHandler", {
80
80
  enumerable: true,
81
- get: function () { return chunkBSLNXKV2_cjs.createMediaZipExtractHandler; }
81
+ get: function () { return chunkCNAHVRRU_cjs.createMediaZipExtractHandler; }
82
82
  });
83
83
  Object.defineProperty(exports, "createSetPasswordHandler", {
84
84
  enumerable: true,
85
- get: function () { return chunkBSLNXKV2_cjs.createSetPasswordHandler; }
85
+ get: function () { return chunkCNAHVRRU_cjs.createSetPasswordHandler; }
86
86
  });
87
87
  Object.defineProperty(exports, "createSettingsApiHandlers", {
88
88
  enumerable: true,
89
- get: function () { return chunkBSLNXKV2_cjs.createSettingsApiHandlers; }
89
+ get: function () { return chunkCNAHVRRU_cjs.createSettingsApiHandlers; }
90
90
  });
91
91
  Object.defineProperty(exports, "createStorefrontApiHandler", {
92
92
  enumerable: true,
93
- get: function () { return chunkBSLNXKV2_cjs.createStorefrontApiHandler; }
93
+ get: function () { return chunkCNAHVRRU_cjs.createStorefrontApiHandler; }
94
94
  });
95
95
  Object.defineProperty(exports, "createUploadHandler", {
96
96
  enumerable: true,
97
- get: function () { return chunkBSLNXKV2_cjs.createUploadHandler; }
97
+ get: function () { return chunkCNAHVRRU_cjs.createUploadHandler; }
98
98
  });
99
99
  Object.defineProperty(exports, "createUserAuthApiRouter", {
100
100
  enumerable: true,
101
- get: function () { return chunkBSLNXKV2_cjs.createUserAuthApiRouter; }
101
+ get: function () { return chunkCNAHVRRU_cjs.createUserAuthApiRouter; }
102
102
  });
103
103
  Object.defineProperty(exports, "createUserAvatarHandler", {
104
104
  enumerable: true,
105
- get: function () { return chunkBSLNXKV2_cjs.createUserAvatarHandler; }
105
+ get: function () { return chunkCNAHVRRU_cjs.createUserAvatarHandler; }
106
106
  });
107
107
  Object.defineProperty(exports, "createUserProfileHandler", {
108
108
  enumerable: true,
109
- get: function () { return chunkBSLNXKV2_cjs.createUserProfileHandler; }
109
+ get: function () { return chunkCNAHVRRU_cjs.createUserProfileHandler; }
110
110
  });
111
111
  Object.defineProperty(exports, "createUsersApiHandlers", {
112
112
  enumerable: true,
113
- get: function () { return chunkBSLNXKV2_cjs.createUsersApiHandlers; }
113
+ get: function () { return chunkCNAHVRRU_cjs.createUsersApiHandlers; }
114
114
  });
115
115
  Object.defineProperty(exports, "createVendorDashboardHandler", {
116
116
  enumerable: true,
117
- get: function () { return chunkBSLNXKV2_cjs.createVendorDashboardHandler; }
117
+ get: function () { return chunkCNAHVRRU_cjs.createVendorDashboardHandler; }
118
118
  });
119
119
  Object.defineProperty(exports, "createVendorOnboardHandlers", {
120
120
  enumerable: true,
121
- get: function () { return chunkBSLNXKV2_cjs.createVendorOnboardHandlers; }
121
+ get: function () { return chunkCNAHVRRU_cjs.createVendorOnboardHandlers; }
122
122
  });
123
123
  Object.defineProperty(exports, "getPublicSettingsGroup", {
124
124
  enumerable: true,
125
- get: function () { return chunkBSLNXKV2_cjs.getPublicSettingsGroup; }
125
+ get: function () { return chunkCNAHVRRU_cjs.getPublicSettingsGroup; }
126
126
  });
127
127
  Object.defineProperty(exports, "mergeGuardrailsIntoSystemPrompt", {
128
128
  enumerable: true,
129
- get: function () { return chunkBSLNXKV2_cjs.mergeGuardrailsIntoSystemPrompt; }
129
+ get: function () { return chunkCNAHVRRU_cjs.mergeGuardrailsIntoSystemPrompt; }
130
130
  });
131
131
  Object.defineProperty(exports, "parseLlmAgentValidationRules", {
132
132
  enumerable: true,
133
- get: function () { return chunkBSLNXKV2_cjs.parseLlmAgentValidationRules; }
133
+ get: function () { return chunkCNAHVRRU_cjs.parseLlmAgentValidationRules; }
134
134
  });
135
135
  Object.defineProperty(exports, "simpleDecrypt", {
136
136
  enumerable: true,
137
- get: function () { return chunkBSLNXKV2_cjs.simpleDecrypt; }
137
+ get: function () { return chunkCNAHVRRU_cjs.simpleDecrypt; }
138
138
  });
139
139
  Object.defineProperty(exports, "simpleEncrypt", {
140
140
  enumerable: true,
141
- get: function () { return chunkBSLNXKV2_cjs.simpleEncrypt; }
141
+ get: function () { return chunkCNAHVRRU_cjs.simpleEncrypt; }
142
142
  });
143
143
  Object.defineProperty(exports, "validateUserMessageAgainstAgentRules", {
144
144
  enumerable: true,
145
- get: function () { return chunkBSLNXKV2_cjs.validateUserMessageAgainstAgentRules; }
145
+ get: function () { return chunkCNAHVRRU_cjs.validateUserMessageAgainstAgentRules; }
146
146
  });
147
147
  Object.defineProperty(exports, "validateUserMessageAgainstStructuredRules", {
148
148
  enumerable: true,
149
- get: function () { return chunkBSLNXKV2_cjs.validateUserMessageAgainstStructuredRules; }
149
+ get: function () { return chunkCNAHVRRU_cjs.validateUserMessageAgainstStructuredRules; }
150
150
  });
151
151
  Object.defineProperty(exports, "createCmsAuthBundle", {
152
152
  enumerable: true,
package/dist/api.js CHANGED
@@ -1,4 +1,4 @@
1
- export { autoExpireOrderIfPaymentTimeExceeded, 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-JAEUYYGA.js';
1
+ export { autoExpireOrderIfPaymentTimeExceeded, 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-UHT4INVW.js';
2
2
  import './chunk-GO7PPYNU.js';
3
3
  import './chunk-3K5AIEIZ.js';
4
4
  import './chunk-URN7GS23.js';
@@ -3856,14 +3856,14 @@ function createCrudHandler(dataSource, entityMap, options) {
3856
3856
  if (Number.isFinite(n)) productWhere[key] = n;
3857
3857
  }
3858
3858
  }
3859
- const idsParam = searchParams.get("ids")?.trim();
3860
- if (idsParam) {
3861
- const ids = idsParam.split(",").map((s) => Number(s.trim())).filter((n) => Number.isFinite(n) && n > 0);
3859
+ const idsParam2 = searchParams.get("ids")?.trim();
3860
+ if (idsParam2) {
3861
+ const ids = idsParam2.split(",").map((s) => Number(s.trim())).filter((n) => Number.isFinite(n) && n > 0);
3862
3862
  productWhere.id = ids.length > 0 ? typeorm.In(ids) : -1;
3863
3863
  } else {
3864
- const excludeIdsParam = searchParams.get("excludeIds")?.trim();
3865
- if (excludeIdsParam) {
3866
- const excludeIds = excludeIdsParam.split(",").map((s) => Number(s.trim())).filter((n) => Number.isFinite(n) && n > 0);
3864
+ const excludeIdsParam2 = searchParams.get("excludeIds")?.trim();
3865
+ if (excludeIdsParam2) {
3866
+ const excludeIds = excludeIdsParam2.split(",").map((s) => Number(s.trim())).filter((n) => Number.isFinite(n) && n > 0);
3867
3867
  if (excludeIds.length > 0) productWhere.id = typeorm.Not(typeorm.In(excludeIds));
3868
3868
  }
3869
3869
  }
@@ -4140,6 +4140,24 @@ function createCrudHandler(dataSource, entityMap, options) {
4140
4140
  }
4141
4141
  }
4142
4142
  where = mergeDeletedFalseWhere(repo, where);
4143
+ const idsParam = searchParams.get("ids")?.trim();
4144
+ if (idsParam && columnNames.has("id")) {
4145
+ const idList = idsParam.split(",").map((s) => Number(s.trim())).filter((n) => Number.isFinite(n) && n > 0);
4146
+ if (idList.length > 0) {
4147
+ where = mergeListWhereAnd(where, {
4148
+ id: typeorm.In(idList)
4149
+ });
4150
+ }
4151
+ }
4152
+ const excludeIdsParam = searchParams.get("excludeIds")?.trim();
4153
+ if (excludeIdsParam && columnNames.has("id")) {
4154
+ const excludeIdList = excludeIdsParam.split(",").map((s) => Number(s.trim())).filter((n) => Number.isFinite(n) && n > 0);
4155
+ if (excludeIdList.length > 0) {
4156
+ where = mergeListWhereAnd(where, {
4157
+ id: typeorm.Not(typeorm.In(excludeIdList))
4158
+ });
4159
+ }
4160
+ }
4143
4161
  if (resourceUsesVendorScope(resource)) {
4144
4162
  const scope = await resolveScope();
4145
4163
  const catalogFlags = await getVendorCatalogCreateFlags(dataSource);
@@ -8820,25 +8838,79 @@ function createUploadHandler(config) {
8820
8838
  "application/x-zip-compressed"
8821
8839
  ];
8822
8840
  return /* @__PURE__ */ chunkUSNT2KNT_cjs.__name(async function POST(req) {
8841
+ const reqId = `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
8842
+ console.info("[upload] POST /api/upload start", {
8843
+ reqId,
8844
+ method: req.method,
8845
+ contentType: req.headers.get("content-type"),
8846
+ contentLength: req.headers.get("content-length"),
8847
+ hasStorageConfig: storage != null
8848
+ });
8823
8849
  const authErr = await requireAuth(req);
8824
- if (authErr) return authErr;
8850
+ if (authErr) {
8851
+ console.error("[upload] auth failed", {
8852
+ reqId,
8853
+ status: authErr.status
8854
+ });
8855
+ return authErr;
8856
+ }
8857
+ console.info("[upload] auth ok", {
8858
+ reqId
8859
+ });
8825
8860
  if (requireEntityPermission) {
8826
8861
  const pe = await requireEntityPermission(req, "upload", "create");
8827
- if (pe) return pe;
8862
+ if (pe) {
8863
+ console.error("[upload] permission denied", {
8864
+ reqId,
8865
+ status: pe.status
8866
+ });
8867
+ return pe;
8868
+ }
8869
+ console.info("[upload] permission ok", {
8870
+ reqId,
8871
+ entity: "upload",
8872
+ action: "create"
8873
+ });
8828
8874
  }
8829
8875
  try {
8876
+ console.info("[upload] parsing formData", {
8877
+ reqId
8878
+ });
8830
8879
  const formData = await req.formData();
8831
8880
  const file = formData.get("file");
8832
- if (!file) return json({
8833
- error: "No file uploaded"
8834
- }, {
8835
- status: 400
8836
- });
8837
- if (!allowed.includes(file.type)) return json({
8838
- error: "File type not allowed"
8839
- }, {
8840
- status: 400
8881
+ console.info("[upload] formData parsed", {
8882
+ reqId,
8883
+ hasFile: Boolean(file),
8884
+ fileName: file?.name ?? null,
8885
+ fileType: file?.type ?? null,
8886
+ fileSize: file?.size ?? null,
8887
+ formKeys: [
8888
+ ...formData.keys()
8889
+ ]
8841
8890
  });
8891
+ if (!file) {
8892
+ console.error("[upload] no file in formData", {
8893
+ reqId
8894
+ });
8895
+ return json({
8896
+ error: "No file uploaded"
8897
+ }, {
8898
+ status: 400
8899
+ });
8900
+ }
8901
+ if (!allowed.includes(file.type)) {
8902
+ console.error("[upload] file type not allowed", {
8903
+ reqId,
8904
+ fileType: file.type,
8905
+ fileName: file.name,
8906
+ allowed
8907
+ });
8908
+ return json({
8909
+ error: "File type not allowed"
8910
+ }, {
8911
+ status: 400
8912
+ });
8913
+ }
8842
8914
  const defaultMax = 10 * 1024 * 1024;
8843
8915
  const maxZipBytes = 80 * 1024 * 1024;
8844
8916
  const maxVideoBytes = 100 * 1024 * 1024;
@@ -8846,25 +8918,51 @@ function createUploadHandler(config) {
8846
8918
  const isZip = file.type === "application/zip" || file.type === "application/x-zip-compressed";
8847
8919
  const isVideo = file.type === "video/mp4" || file.type === "video/webm" || file.type === "video/quicktime";
8848
8920
  const effectiveMax = isZip ? Math.max(baseMax, maxZipBytes) : isVideo ? Math.max(baseMax, maxVideoBytes) : baseMax;
8849
- if (file.size > effectiveMax) return json({
8850
- error: "File size exceeds limit"
8851
- }, {
8852
- status: 400
8921
+ console.info("[upload] size check", {
8922
+ reqId,
8923
+ fileSize: file.size,
8924
+ effectiveMax,
8925
+ isZip,
8926
+ isVideo,
8927
+ isImage: file.type.startsWith("image/")
8853
8928
  });
8929
+ if (file.size > effectiveMax) {
8930
+ console.error("[upload] file too large", {
8931
+ reqId,
8932
+ fileSize: file.size,
8933
+ effectiveMax,
8934
+ fileName: file.name
8935
+ });
8936
+ return json({
8937
+ error: "File size exceeds limit"
8938
+ }, {
8939
+ status: 400
8940
+ });
8941
+ }
8854
8942
  const parentRaw = formData.get("parentId");
8855
8943
  let parentId = null;
8856
8944
  if (parentRaw != null && String(parentRaw).trim() !== "") {
8857
8945
  const n = Number(parentRaw);
8858
- if (!Number.isFinite(n)) return json({
8859
- error: "Invalid parentId"
8860
- }, {
8861
- status: 400
8862
- });
8946
+ if (!Number.isFinite(n)) {
8947
+ console.error("[upload] invalid parentId", {
8948
+ reqId,
8949
+ parentRaw
8950
+ });
8951
+ return json({
8952
+ error: "Invalid parentId"
8953
+ }, {
8954
+ status: 400
8955
+ });
8956
+ }
8863
8957
  parentId = n;
8864
8958
  }
8865
8959
  let folder = "";
8866
8960
  if (parentId != null) {
8867
8961
  if (!dataSource || !entityMap?.media) {
8962
+ console.error("[upload] missing dataSource/entityMap for folder upload", {
8963
+ reqId,
8964
+ parentId
8965
+ });
8868
8966
  return json({
8869
8967
  error: "Upload handler needs dataSource and entityMap for folder uploads"
8870
8968
  }, {
@@ -8878,6 +8976,12 @@ function createUploadHandler(config) {
8878
8976
  }
8879
8977
  });
8880
8978
  if (!p || p.kind !== "folder") {
8979
+ console.error("[upload] parent is not a folder", {
8980
+ reqId,
8981
+ parentId,
8982
+ found: Boolean(p),
8983
+ kind: p ? p.kind : null
8984
+ });
8881
8985
  return json({
8882
8986
  error: "parent must be a folder"
8883
8987
  }, {
@@ -8885,25 +8989,90 @@ function createUploadHandler(config) {
8885
8989
  });
8886
8990
  }
8887
8991
  folder = await relativePathFromMediaParentId(dataSource, entityMap, parentId);
8992
+ console.info("[upload] resolved folder from parentId", {
8993
+ reqId,
8994
+ parentId,
8995
+ folder
8996
+ });
8888
8997
  } else {
8889
8998
  const folderRawLegacy = formData.get("folder") ?? formData.get("folderPath");
8890
8999
  if (folderRawLegacy && typeof folderRawLegacy === "string" && folderRawLegacy.trim()) {
8891
9000
  folder = sanitizeMediaFolderPath(folderRawLegacy);
9001
+ console.info("[upload] resolved folder from legacy field", {
9002
+ reqId,
9003
+ folder
9004
+ });
8892
9005
  }
8893
9006
  }
9007
+ console.info("[upload] reading file into buffer", {
9008
+ reqId,
9009
+ fileName: file.name,
9010
+ fileType: file.type,
9011
+ fileSize: file.size
9012
+ });
8894
9013
  const buffer = Buffer.from(await file.arrayBuffer());
8895
9014
  const fileName = `${Date.now()}-${file.name}`;
8896
9015
  const contentType = file.type || "application/octet-stream";
8897
9016
  const relativeUnderUploads = folder ? `${folder}/${fileName}` : fileName;
9017
+ const storageKey = `uploads/${relativeUnderUploads}`;
9018
+ console.info("[upload] S3/storage key prepared", {
9019
+ reqId,
9020
+ originalFileName: file.name,
9021
+ stampedFileName: fileName,
9022
+ folder: folder || "(root)",
9023
+ relativeUnderUploads,
9024
+ storageKey,
9025
+ contentType,
9026
+ bytes: buffer.length
9027
+ });
8898
9028
  const raw = typeof storage === "function" ? storage() : storage;
9029
+ console.info("[upload] resolving storage service", {
9030
+ reqId,
9031
+ storageKey,
9032
+ storageIsFunction: typeof storage === "function",
9033
+ rawIsPromise: raw instanceof Promise,
9034
+ rawIsNullish: raw == null
9035
+ });
8899
9036
  const storageService = raw instanceof Promise ? await raw : raw;
9037
+ console.info("[upload] storage service resolved", {
9038
+ reqId,
9039
+ storageKey,
9040
+ hasStorageService: Boolean(storageService)
9041
+ });
8900
9042
  if (storageService) {
8901
- const fileUrl = await storageService.upload(buffer, `uploads/${relativeUnderUploads}`, contentType);
9043
+ console.info("[upload] calling storage.upload", {
9044
+ reqId,
9045
+ storageKey,
9046
+ contentType,
9047
+ bytes: buffer.length
9048
+ });
9049
+ const uploadStarted = Date.now();
9050
+ let fileUrl;
9051
+ try {
9052
+ fileUrl = await storageService.upload(buffer, storageKey, contentType);
9053
+ } catch (storageErr) {
9054
+ console.error("[upload] storage.upload threw", {
9055
+ reqId,
9056
+ storageKey,
9057
+ contentType,
9058
+ bytes: buffer.length,
9059
+ ms: Date.now() - uploadStarted,
9060
+ error: storageErr instanceof Error ? storageErr.message : String(storageErr),
9061
+ name: storageErr instanceof Error ? storageErr.name : void 0,
9062
+ stack: storageErr instanceof Error ? storageErr.stack : void 0,
9063
+ code: storageErr && typeof storageErr === "object" && ("Code" in storageErr || "code" in storageErr) ? storageErr.Code ?? storageErr.code : void 0,
9064
+ metadata: storageErr && typeof storageErr === "object" && "$metadata" in storageErr ? storageErr.$metadata : void 0
9065
+ });
9066
+ throw storageErr;
9067
+ }
8902
9068
  console.info("[upload] stored via storage plugin", {
8903
- key: `uploads/${relativeUnderUploads}`,
9069
+ reqId,
9070
+ key: storageKey,
9071
+ fullS3KeyHint: storageKey,
8904
9072
  contentType,
8905
9073
  bytes: buffer.length,
8906
- fileUrl
9074
+ fileUrl,
9075
+ ms: Date.now() - uploadStarted
8907
9076
  });
8908
9077
  return json({
8909
9078
  filePath: fileUrl,
@@ -8911,8 +9080,10 @@ function createUploadHandler(config) {
8911
9080
  });
8912
9081
  }
8913
9082
  console.warn("[upload] no storage plugin \u2014 writing local disk (broken on most deploys)", {
9083
+ reqId,
8914
9084
  localUploadDir,
8915
- key: relativeUnderUploads
9085
+ key: relativeUnderUploads,
9086
+ storageKey
8916
9087
  });
8917
9088
  const fs2 = await import('fs/promises');
8918
9089
  const path2 = await import('path');
@@ -8923,6 +9094,12 @@ function createUploadHandler(config) {
8923
9094
  });
8924
9095
  await fs2.writeFile(filePath, buffer);
8925
9096
  const urlRel = `${localUploadDir.replace(/^\/+/, "").replace(/\\/g, "/")}/${relativeUnderUploads.replace(/\\/g, "/")}`;
9097
+ console.info("[upload] local write ok", {
9098
+ reqId,
9099
+ diskPath: filePath,
9100
+ filePath: `/${urlRel}`,
9101
+ key: relativeUnderUploads
9102
+ });
8926
9103
  return json({
8927
9104
  filePath: `/${urlRel}`,
8928
9105
  parentId
@@ -8931,11 +9108,13 @@ function createUploadHandler(config) {
8931
9108
  const message = err instanceof Error ? err.message : String(err);
8932
9109
  const awsMeta = err && typeof err === "object" && "$metadata" in err ? err.$metadata : void 0;
8933
9110
  console.error("[upload] File upload failed", {
9111
+ reqId,
8934
9112
  error: message,
8935
9113
  stack: err instanceof Error ? err.stack : void 0,
8936
9114
  name: err instanceof Error ? err.name : void 0,
8937
9115
  code: err && typeof err === "object" && ("Code" in err || "code" in err) ? err.Code ?? err.code : void 0,
8938
- metadata: awsMeta
9116
+ metadata: awsMeta,
9117
+ raw: err instanceof Error ? void 0 : String(err)
8939
9118
  });
8940
9119
  if (/Failed to parse body as FormData/i.test(message)) {
8941
9120
  return json({
@@ -9272,13 +9451,43 @@ function createFormSaveHandlers(config) {
9272
9451
  }
9273
9452
  }
9274
9453
  if (Object.keys(formRow).length > 0) await formRepo().update(formId, formRow);
9275
- await fieldRepo().delete({
9276
- formId
9277
- });
9454
+ const incomingFieldIds = /* @__PURE__ */ new Set();
9278
9455
  for (let i = 0; i < fields.length; i++) {
9279
- const row = normalizeFieldRow(fields[i], formId);
9456
+ const f = fields[i];
9457
+ const fieldId = f.id != null && Number.isFinite(Number(f.id)) && Number(f.id) > 0 ? Number(f.id) : null;
9458
+ const row = normalizeFieldRow(f, formId);
9280
9459
  row.order = i + 1;
9281
- await fieldRepo().save(fieldRepo().create(row));
9460
+ if (fieldId) {
9461
+ const existingField = await fieldRepo().findOne({
9462
+ where: {
9463
+ id: fieldId,
9464
+ formId
9465
+ }
9466
+ });
9467
+ if (existingField) {
9468
+ incomingFieldIds.add(fieldId);
9469
+ await fieldRepo().update({
9470
+ id: fieldId,
9471
+ formId
9472
+ }, row);
9473
+ continue;
9474
+ }
9475
+ }
9476
+ const created = await fieldRepo().save(fieldRepo().create(row));
9477
+ if (created?.id) incomingFieldIds.add(created.id);
9478
+ }
9479
+ const allCurrentFields = await fieldRepo().find({
9480
+ where: {
9481
+ formId
9482
+ }
9483
+ });
9484
+ for (const existingField of allCurrentFields) {
9485
+ if (!incomingFieldIds.has(existingField.id)) {
9486
+ await fieldRepo().delete({
9487
+ id: existingField.id,
9488
+ formId
9489
+ });
9490
+ }
9282
9491
  }
9283
9492
  const saved = await formRepo().findOne({
9284
9493
  where: {
@@ -9432,7 +9641,7 @@ function createFormSubmissionListHandler(config) {
9432
9641
  const limit = Math.min(100, Number(searchParams.get("limit")) || 10);
9433
9642
  const skip = (page - 1) * limit;
9434
9643
  const sortField = searchParams.get("sortField") || "createdAt";
9435
- const sortOrder = searchParams.get("sortOrder") === "desc" ? "DESC" : "ASC";
9644
+ const sortOrder = searchParams.get("sortOrder") === "asc" ? "ASC" : "DESC";
9436
9645
  const [data, total] = await repo.findAndCount({
9437
9646
  skip,
9438
9647
  take: limit,
@@ -31204,7 +31413,7 @@ function createStorefrontApiHandler(config) {
31204
31413
  const meta = it.metadata && typeof it.metadata === "object" && !Array.isArray(it.metadata) ? it.metadata : {};
31205
31414
  const fromMeta = Number(meta.comboId ?? meta.combo_id);
31206
31415
  if (Number.isInteger(fromMeta) && fromMeta > 0) return fromMeta;
31207
- if (meta.isCombo === true || meta.type === "combo" || meta.lineType === "combo") {
31416
+ if (meta.isCombo === true || meta.type === "combo" || meta.lineType === "combo" || meta.lineKind === "combo" || meta.itemType === "combo") {
31208
31417
  const pid = Number(it.productId);
31209
31418
  if (Number.isInteger(pid) && pid > 0) return pid;
31210
31419
  }
@@ -33333,7 +33542,10 @@ function createStorefrontApiHandler(config) {
33333
33542
  });
33334
33543
  if (existing) {
33335
33544
  await cartItemRepo().update(existing.id, {
33336
- quantity: existing.quantity + gi.quantity
33545
+ quantity: gi.quantity,
33546
+ ...gi.metadata ? {
33547
+ metadata: gi.metadata
33548
+ } : {}
33337
33549
  });
33338
33550
  } else {
33339
33551
  await cartItemRepo().save(cartItemRepo().create({