@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/admin.cjs +579 -47
- package/dist/admin.js +580 -48
- package/dist/api.cjs +33 -33
- package/dist/api.js +1 -1
- package/dist/{chunk-BSLNXKV2.cjs → chunk-CNAHVRRU.cjs} +251 -39
- package/dist/{chunk-JAEUYYGA.js → chunk-UHT4INVW.js} +251 -39
- package/dist/index.cjs +489 -246
- package/dist/index.js +277 -34
- package/package.json +1 -1
package/dist/api.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
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
|
|
25
|
+
get: function () { return chunkCNAHVRRU_cjs.autoExpireOrderIfPaymentTimeExceeded; }
|
|
26
26
|
});
|
|
27
27
|
Object.defineProperty(exports, "createAnalyticsHandlers", {
|
|
28
28
|
enumerable: true,
|
|
29
|
-
get: function () { return
|
|
29
|
+
get: function () { return chunkCNAHVRRU_cjs.createAnalyticsHandlers; }
|
|
30
30
|
});
|
|
31
31
|
Object.defineProperty(exports, "createBlogBySlugHandler", {
|
|
32
32
|
enumerable: true,
|
|
33
|
-
get: function () { return
|
|
33
|
+
get: function () { return chunkCNAHVRRU_cjs.createBlogBySlugHandler; }
|
|
34
34
|
});
|
|
35
35
|
Object.defineProperty(exports, "createChangePasswordHandler", {
|
|
36
36
|
enumerable: true,
|
|
37
|
-
get: function () { return
|
|
37
|
+
get: function () { return chunkCNAHVRRU_cjs.createChangePasswordHandler; }
|
|
38
38
|
});
|
|
39
39
|
Object.defineProperty(exports, "createCmsApiHandler", {
|
|
40
40
|
enumerable: true,
|
|
41
|
-
get: function () { return
|
|
41
|
+
get: function () { return chunkCNAHVRRU_cjs.createCmsApiHandler; }
|
|
42
42
|
});
|
|
43
43
|
Object.defineProperty(exports, "createCrudByIdHandler", {
|
|
44
44
|
enumerable: true,
|
|
45
|
-
get: function () { return
|
|
45
|
+
get: function () { return chunkCNAHVRRU_cjs.createCrudByIdHandler; }
|
|
46
46
|
});
|
|
47
47
|
Object.defineProperty(exports, "createCrudHandler", {
|
|
48
48
|
enumerable: true,
|
|
49
|
-
get: function () { return
|
|
49
|
+
get: function () { return chunkCNAHVRRU_cjs.createCrudHandler; }
|
|
50
50
|
});
|
|
51
51
|
Object.defineProperty(exports, "createDashboardStatsHandler", {
|
|
52
52
|
enumerable: true,
|
|
53
|
-
get: function () { return
|
|
53
|
+
get: function () { return chunkCNAHVRRU_cjs.createDashboardStatsHandler; }
|
|
54
54
|
});
|
|
55
55
|
Object.defineProperty(exports, "createEcommerceAnalyticsHandler", {
|
|
56
56
|
enumerable: true,
|
|
57
|
-
get: function () { return
|
|
57
|
+
get: function () { return chunkCNAHVRRU_cjs.createEcommerceAnalyticsHandler; }
|
|
58
58
|
});
|
|
59
59
|
Object.defineProperty(exports, "createForgotPasswordHandler", {
|
|
60
60
|
enumerable: true,
|
|
61
|
-
get: function () { return
|
|
61
|
+
get: function () { return chunkCNAHVRRU_cjs.createForgotPasswordHandler; }
|
|
62
62
|
});
|
|
63
63
|
Object.defineProperty(exports, "createFormBySlugHandler", {
|
|
64
64
|
enumerable: true,
|
|
65
|
-
get: function () { return
|
|
65
|
+
get: function () { return chunkCNAHVRRU_cjs.createFormBySlugHandler; }
|
|
66
66
|
});
|
|
67
67
|
Object.defineProperty(exports, "createInviteAcceptHandler", {
|
|
68
68
|
enumerable: true,
|
|
69
|
-
get: function () { return
|
|
69
|
+
get: function () { return chunkCNAHVRRU_cjs.createInviteAcceptHandler; }
|
|
70
70
|
});
|
|
71
71
|
Object.defineProperty(exports, "createJobScheduleHandlers", {
|
|
72
72
|
enumerable: true,
|
|
73
|
-
get: function () { return
|
|
73
|
+
get: function () { return chunkCNAHVRRU_cjs.createJobScheduleHandlers; }
|
|
74
74
|
});
|
|
75
75
|
Object.defineProperty(exports, "createLlmAgentKnowledgeHandlers", {
|
|
76
76
|
enumerable: true,
|
|
77
|
-
get: function () { return
|
|
77
|
+
get: function () { return chunkCNAHVRRU_cjs.createLlmAgentKnowledgeHandlers; }
|
|
78
78
|
});
|
|
79
79
|
Object.defineProperty(exports, "createMediaZipExtractHandler", {
|
|
80
80
|
enumerable: true,
|
|
81
|
-
get: function () { return
|
|
81
|
+
get: function () { return chunkCNAHVRRU_cjs.createMediaZipExtractHandler; }
|
|
82
82
|
});
|
|
83
83
|
Object.defineProperty(exports, "createSetPasswordHandler", {
|
|
84
84
|
enumerable: true,
|
|
85
|
-
get: function () { return
|
|
85
|
+
get: function () { return chunkCNAHVRRU_cjs.createSetPasswordHandler; }
|
|
86
86
|
});
|
|
87
87
|
Object.defineProperty(exports, "createSettingsApiHandlers", {
|
|
88
88
|
enumerable: true,
|
|
89
|
-
get: function () { return
|
|
89
|
+
get: function () { return chunkCNAHVRRU_cjs.createSettingsApiHandlers; }
|
|
90
90
|
});
|
|
91
91
|
Object.defineProperty(exports, "createStorefrontApiHandler", {
|
|
92
92
|
enumerable: true,
|
|
93
|
-
get: function () { return
|
|
93
|
+
get: function () { return chunkCNAHVRRU_cjs.createStorefrontApiHandler; }
|
|
94
94
|
});
|
|
95
95
|
Object.defineProperty(exports, "createUploadHandler", {
|
|
96
96
|
enumerable: true,
|
|
97
|
-
get: function () { return
|
|
97
|
+
get: function () { return chunkCNAHVRRU_cjs.createUploadHandler; }
|
|
98
98
|
});
|
|
99
99
|
Object.defineProperty(exports, "createUserAuthApiRouter", {
|
|
100
100
|
enumerable: true,
|
|
101
|
-
get: function () { return
|
|
101
|
+
get: function () { return chunkCNAHVRRU_cjs.createUserAuthApiRouter; }
|
|
102
102
|
});
|
|
103
103
|
Object.defineProperty(exports, "createUserAvatarHandler", {
|
|
104
104
|
enumerable: true,
|
|
105
|
-
get: function () { return
|
|
105
|
+
get: function () { return chunkCNAHVRRU_cjs.createUserAvatarHandler; }
|
|
106
106
|
});
|
|
107
107
|
Object.defineProperty(exports, "createUserProfileHandler", {
|
|
108
108
|
enumerable: true,
|
|
109
|
-
get: function () { return
|
|
109
|
+
get: function () { return chunkCNAHVRRU_cjs.createUserProfileHandler; }
|
|
110
110
|
});
|
|
111
111
|
Object.defineProperty(exports, "createUsersApiHandlers", {
|
|
112
112
|
enumerable: true,
|
|
113
|
-
get: function () { return
|
|
113
|
+
get: function () { return chunkCNAHVRRU_cjs.createUsersApiHandlers; }
|
|
114
114
|
});
|
|
115
115
|
Object.defineProperty(exports, "createVendorDashboardHandler", {
|
|
116
116
|
enumerable: true,
|
|
117
|
-
get: function () { return
|
|
117
|
+
get: function () { return chunkCNAHVRRU_cjs.createVendorDashboardHandler; }
|
|
118
118
|
});
|
|
119
119
|
Object.defineProperty(exports, "createVendorOnboardHandlers", {
|
|
120
120
|
enumerable: true,
|
|
121
|
-
get: function () { return
|
|
121
|
+
get: function () { return chunkCNAHVRRU_cjs.createVendorOnboardHandlers; }
|
|
122
122
|
});
|
|
123
123
|
Object.defineProperty(exports, "getPublicSettingsGroup", {
|
|
124
124
|
enumerable: true,
|
|
125
|
-
get: function () { return
|
|
125
|
+
get: function () { return chunkCNAHVRRU_cjs.getPublicSettingsGroup; }
|
|
126
126
|
});
|
|
127
127
|
Object.defineProperty(exports, "mergeGuardrailsIntoSystemPrompt", {
|
|
128
128
|
enumerable: true,
|
|
129
|
-
get: function () { return
|
|
129
|
+
get: function () { return chunkCNAHVRRU_cjs.mergeGuardrailsIntoSystemPrompt; }
|
|
130
130
|
});
|
|
131
131
|
Object.defineProperty(exports, "parseLlmAgentValidationRules", {
|
|
132
132
|
enumerable: true,
|
|
133
|
-
get: function () { return
|
|
133
|
+
get: function () { return chunkCNAHVRRU_cjs.parseLlmAgentValidationRules; }
|
|
134
134
|
});
|
|
135
135
|
Object.defineProperty(exports, "simpleDecrypt", {
|
|
136
136
|
enumerable: true,
|
|
137
|
-
get: function () { return
|
|
137
|
+
get: function () { return chunkCNAHVRRU_cjs.simpleDecrypt; }
|
|
138
138
|
});
|
|
139
139
|
Object.defineProperty(exports, "simpleEncrypt", {
|
|
140
140
|
enumerable: true,
|
|
141
|
-
get: function () { return
|
|
141
|
+
get: function () { return chunkCNAHVRRU_cjs.simpleEncrypt; }
|
|
142
142
|
});
|
|
143
143
|
Object.defineProperty(exports, "validateUserMessageAgainstAgentRules", {
|
|
144
144
|
enumerable: true,
|
|
145
|
-
get: function () { return
|
|
145
|
+
get: function () { return chunkCNAHVRRU_cjs.validateUserMessageAgainstAgentRules; }
|
|
146
146
|
});
|
|
147
147
|
Object.defineProperty(exports, "validateUserMessageAgainstStructuredRules", {
|
|
148
148
|
enumerable: true,
|
|
149
|
-
get: function () { return
|
|
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-
|
|
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
|
|
3860
|
-
if (
|
|
3861
|
-
const ids =
|
|
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
|
|
3865
|
-
if (
|
|
3866
|
-
const excludeIds =
|
|
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)
|
|
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)
|
|
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
|
-
|
|
8833
|
-
|
|
8834
|
-
|
|
8835
|
-
|
|
8836
|
-
|
|
8837
|
-
|
|
8838
|
-
|
|
8839
|
-
|
|
8840
|
-
|
|
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
|
-
|
|
8850
|
-
|
|
8851
|
-
|
|
8852
|
-
|
|
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))
|
|
8859
|
-
error
|
|
8860
|
-
|
|
8861
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9276
|
-
formId
|
|
9277
|
-
});
|
|
9454
|
+
const incomingFieldIds = /* @__PURE__ */ new Set();
|
|
9278
9455
|
for (let i = 0; i < fields.length; i++) {
|
|
9279
|
-
const
|
|
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
|
-
|
|
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") === "
|
|
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:
|
|
33545
|
+
quantity: gi.quantity,
|
|
33546
|
+
...gi.metadata ? {
|
|
33547
|
+
metadata: gi.metadata
|
|
33548
|
+
} : {}
|
|
33337
33549
|
});
|
|
33338
33550
|
} else {
|
|
33339
33551
|
await cartItemRepo().save(cartItemRepo().create({
|