@shushed/helpers 0.0.202-v2-20251208085030 → 0.0.202
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/cjs/contracts/asset.schema.json +78 -0
- package/dist/cjs/contracts/category.schema.json +86 -0
- package/dist/cjs/contracts/country.schema.json +258 -0
- package/dist/cjs/contracts/currency.schema.json +177 -0
- package/dist/cjs/contracts/customer-segment.schema.json +32 -0
- package/dist/cjs/contracts/development-colour.schema.json +97 -0
- package/dist/cjs/contracts/index.js +48 -0
- package/dist/cjs/contracts/marketing-preferences.schema.json +41 -0
- package/dist/cjs/contracts/messages/ean-change.schema.json +22 -0
- package/dist/cjs/contracts/messages/index.js +29 -0
- package/dist/cjs/contracts/messages/order/delivered.schema.json +26 -0
- package/dist/cjs/contracts/messages/order/index.js +18 -0
- package/dist/cjs/contracts/messages/order/new.schema.json +32 -0
- package/dist/cjs/contracts/messages/order/processed.schema.json +15 -0
- package/dist/cjs/contracts/messages/order/return-initiated.schema.json +26 -0
- package/dist/cjs/contracts/messages/order/returned.schema.json +25 -0
- package/dist/cjs/contracts/messages/order/shipped.schema.json +26 -0
- package/dist/cjs/contracts/messages/product-category.schema.json +21 -0
- package/dist/cjs/contracts/messages/product-draft.schema.json +66 -0
- package/dist/cjs/contracts/messages/product.schema.json +29 -0
- package/dist/cjs/contracts/money.schema.json +54 -0
- package/dist/cjs/contracts/order/address.schema.json +127 -0
- package/dist/cjs/contracts/order/customer.schema.json +149 -0
- package/dist/cjs/contracts/order/index.js +31 -0
- package/dist/cjs/contracts/order/item.schema.json +98 -0
- package/dist/cjs/contracts/order/payment.schema.json +115 -0
- package/dist/cjs/contracts/order/shipment/index.js +29 -0
- package/dist/cjs/contracts/order/shipment/item/index.js +8 -0
- package/dist/cjs/contracts/order/shipment/item/returned.schema.json +30 -0
- package/dist/cjs/contracts/order/shipment/item.schema.json +22 -0
- package/dist/cjs/contracts/order/shipment/pos/index.js +10 -0
- package/dist/cjs/contracts/order/shipment/pos/outbound.schema.json +37 -0
- package/dist/cjs/contracts/order/shipment/pos/return.schema.json +31 -0
- package/dist/cjs/contracts/order/shipment/pos.schema.json +48 -0
- package/dist/cjs/contracts/order/shipment/shipped/index.js +10 -0
- package/dist/cjs/contracts/order/shipment/shipped/outbound.schema.json +34 -0
- package/dist/cjs/contracts/order/shipment/shipped/return.schema.json +43 -0
- package/dist/cjs/contracts/order/shipment/shipped.schema.json +52 -0
- package/dist/cjs/contracts/order/shipment.schema.json +58 -0
- package/dist/cjs/contracts/order.schema.json +231 -0
- package/dist/cjs/contracts/product-category.schema.json +34 -0
- package/dist/cjs/contracts/product-draft.schema.json +782 -0
- package/dist/cjs/contracts/product.schema.json +816 -0
- package/dist/cjs/contracts/total.schema.json +41 -0
- package/dist/cjs/dist-dereferenced/messages/order/delivered.js +1 -1
- package/dist/cjs/dist-dereferenced/messages/order/new.js +1 -1
- package/dist/cjs/dist-dereferenced/messages/order/processed.js +1 -1
- package/dist/cjs/dist-dereferenced/messages/order/return-initiated.js +1 -1
- package/dist/cjs/dist-dereferenced/messages/order/returned.js +1 -1
- package/dist/cjs/dist-dereferenced/messages/order/shipped.js +1 -1
- package/dist/cjs/dist-dereferenced/order/customer.js +1 -1
- package/dist/cjs/dist-dereferenced/order/item.js +1 -1
- package/dist/cjs/dist-dereferenced/order/orderMain.js +1 -1
- package/dist/cjs/dist-dereferenced/order/payment.js +1 -1
- package/dist/cjs/dist-dereferenced/order/shipment/pos/outbound.js +1 -1
- package/dist/cjs/dist-dereferenced/order/shipment/pos/return.js +1 -1
- package/dist/cjs/src-public/bcOrder.js +943 -0
- package/dist/cjs/src-public/dato.js +10 -287
- package/dist/cjs/src-public/index.js +3 -1
- package/dist/cjs/src-public/validate.js +34 -0
- package/dist/types/contracts/index.d.ts +15 -0
- package/dist/types/contracts/messages/index.d.ts +5 -0
- package/dist/types/contracts/messages/order/index.d.ts +6 -0
- package/dist/types/contracts/order/index.d.ts +6 -0
- package/dist/types/contracts/order/shipment/index.d.ts +6 -0
- package/dist/types/contracts/order/shipment/item/index.d.ts +1 -0
- package/dist/types/contracts/order/shipment/pos/index.d.ts +2 -0
- package/dist/types/contracts/order/shipment/shipped/index.d.ts +2 -0
- package/dist/types/dist-dereferenced/messages/order/delivered.d.ts +34 -10
- package/dist/types/dist-dereferenced/messages/order/new.d.ts +34 -10
- package/dist/types/dist-dereferenced/messages/order/processed.d.ts +34 -10
- package/dist/types/dist-dereferenced/messages/order/return-initiated.d.ts +34 -10
- package/dist/types/dist-dereferenced/messages/order/returned.d.ts +34 -10
- package/dist/types/dist-dereferenced/messages/order/shipped.d.ts +34 -10
- package/dist/types/dist-dereferenced/order/customer.d.ts +3 -0
- package/dist/types/dist-dereferenced/order/index.d.ts +34 -10
- package/dist/types/dist-dereferenced/order/item.d.ts +6 -3
- package/dist/types/dist-dereferenced/order/orderMain.d.ts +34 -10
- package/dist/types/dist-dereferenced/order/payment.d.ts +16 -0
- package/dist/types/dist-dereferenced/order/shipment/pos/outbound.d.ts +0 -1
- package/dist/types/dist-dereferenced/order/shipment/pos/return.d.ts +0 -1
- package/dist/types/dist-types/messages/order/delivered.d.ts +13 -5
- package/dist/types/dist-types/messages/order/new.d.ts +13 -5
- package/dist/types/dist-types/messages/order/processed.d.ts +13 -5
- package/dist/types/dist-types/messages/order/return-initiated.d.ts +13 -5
- package/dist/types/dist-types/messages/order/returned.d.ts +13 -5
- package/dist/types/dist-types/messages/order/shipped.d.ts +13 -5
- package/dist/types/dist-types/order/customer.d.ts +1 -0
- package/dist/types/dist-types/order/item.d.ts +4 -3
- package/dist/types/dist-types/order/orderMain.d.ts +13 -5
- package/dist/types/dist-types/order/payment.d.ts +4 -0
- package/dist/types/src-public/bcOrder.d.ts +84 -0
- package/dist/types/src-public/dato.d.ts +1 -34
- package/dist/types/src-public/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -7,23 +7,15 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const mime_types_1 = require("mime-types");
|
|
9
9
|
const runtime_1 = __importDefault(require("./runtime"));
|
|
10
|
-
const utils_1 = require("./utils");
|
|
11
10
|
class DatoHelper extends runtime_1.default {
|
|
12
11
|
apiToken;
|
|
13
12
|
baseUrl;
|
|
14
13
|
environment;
|
|
15
|
-
root;
|
|
16
14
|
constructor(opts, datoOpts) {
|
|
17
15
|
super(opts);
|
|
18
16
|
this.apiToken = datoOpts.apiToken;
|
|
19
17
|
this.baseUrl = datoOpts.baseUrl || 'https://site-api.datocms.com';
|
|
20
18
|
this.environment = datoOpts.environment || 'main';
|
|
21
|
-
this.root = datoOpts.root;
|
|
22
|
-
}
|
|
23
|
-
handle429(response) {
|
|
24
|
-
if (response.status === 429 && this.root) {
|
|
25
|
-
(0, utils_1.setRetryAfterVariable)(response, { root: this.root });
|
|
26
|
-
}
|
|
27
19
|
}
|
|
28
20
|
async requestUploadParameters(filename) {
|
|
29
21
|
const response = await fetch(`${this.baseUrl}/upload-requests`, {
|
|
@@ -44,7 +36,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
44
36
|
},
|
|
45
37
|
}),
|
|
46
38
|
});
|
|
47
|
-
this.handle429(response);
|
|
48
39
|
if (!response.ok) {
|
|
49
40
|
const errorText = await response.text();
|
|
50
41
|
this.logging.error(`Failed to request upload parameters: ${response.statusText} - ${errorText}`);
|
|
@@ -81,11 +72,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
81
72
|
return response;
|
|
82
73
|
}
|
|
83
74
|
async createAssetFromUpload(uploadId, opts, uploadCollectionId) {
|
|
84
|
-
const normalizedTags = Array.isArray(opts.tags) && opts.tags.length > 0
|
|
85
|
-
? opts.tags
|
|
86
|
-
: ["integrations"];
|
|
87
|
-
const safeTitle = opts.title && opts.title.trim().length > 0 ? opts.title : "untitled";
|
|
88
|
-
const safeAlt = opts.alt && opts.alt.trim().length > 0 ? opts.alt : safeTitle;
|
|
89
75
|
const body = {
|
|
90
76
|
data: {
|
|
91
77
|
type: 'upload',
|
|
@@ -94,35 +80,13 @@ class DatoHelper extends runtime_1.default {
|
|
|
94
80
|
author: opts.author,
|
|
95
81
|
copyright: opts.copyright,
|
|
96
82
|
notes: opts.notes || null,
|
|
97
|
-
title: safeTitle,
|
|
98
|
-
alt: safeAlt,
|
|
99
83
|
default_field_metadata: {
|
|
100
|
-
"en-GB": {
|
|
101
|
-
title: safeTitle,
|
|
102
|
-
alt: safeAlt,
|
|
103
|
-
custom_data: {
|
|
104
|
-
source: normalizedTags[0] || "uploaded-by-integrations",
|
|
105
|
-
tags: normalizedTags,
|
|
106
|
-
}
|
|
107
|
-
},
|
|
108
84
|
en: {
|
|
109
|
-
title:
|
|
110
|
-
alt:
|
|
111
|
-
custom_data: {
|
|
112
|
-
source: normalizedTags[0] || "uploaded-by-integrations",
|
|
113
|
-
tags: normalizedTags,
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
"en-US": {
|
|
117
|
-
title: safeTitle,
|
|
118
|
-
alt: safeAlt,
|
|
119
|
-
custom_data: {
|
|
120
|
-
source: normalizedTags[0] || "uploaded-by-integrations",
|
|
121
|
-
tags: normalizedTags,
|
|
122
|
-
}
|
|
85
|
+
title: opts.title,
|
|
86
|
+
alt: opts.alt,
|
|
123
87
|
}
|
|
124
88
|
},
|
|
125
|
-
tags:
|
|
89
|
+
tags: opts.tags || [],
|
|
126
90
|
},
|
|
127
91
|
},
|
|
128
92
|
};
|
|
@@ -147,7 +111,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
147
111
|
},
|
|
148
112
|
body: JSON.stringify(body),
|
|
149
113
|
});
|
|
150
|
-
this.handle429(response);
|
|
151
114
|
if (!response.ok) {
|
|
152
115
|
const errorText = await response.text();
|
|
153
116
|
this.logging.error(`Failed to create asset from upload: ${response.statusText} - ${errorText}`);
|
|
@@ -165,7 +128,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
165
128
|
'X-Environment': this.environment
|
|
166
129
|
},
|
|
167
130
|
});
|
|
168
|
-
this.handle429(response);
|
|
169
131
|
if (!response.ok) {
|
|
170
132
|
if (response.status === 404) {
|
|
171
133
|
return null;
|
|
@@ -193,120 +155,8 @@ class DatoHelper extends runtime_1.default {
|
|
|
193
155
|
this.logging.error(timeoutMsg);
|
|
194
156
|
throw new Error(timeoutMsg);
|
|
195
157
|
}
|
|
196
|
-
updateUpload = async (options) => {
|
|
197
|
-
try {
|
|
198
|
-
this.logging.log(`Starting update upload - ${JSON.stringify(options)}`);
|
|
199
|
-
if (!options.id)
|
|
200
|
-
throw new Error("updateUpload requires 'id' in options");
|
|
201
|
-
const safeTitle = options.title && options.title.trim().length > 0
|
|
202
|
-
? options.title.trim()
|
|
203
|
-
: options.filename?.trim().split(".")[0] || "untitled";
|
|
204
|
-
const safeAlt = options.alt && options.alt.trim().length > 0
|
|
205
|
-
? options.alt.trim()
|
|
206
|
-
: safeTitle;
|
|
207
|
-
const normalizedTags = Array.isArray(options.tags) && options.tags.length > 0
|
|
208
|
-
? options.tags
|
|
209
|
-
: ["integrations"];
|
|
210
|
-
const body = {
|
|
211
|
-
data: {
|
|
212
|
-
type: "upload",
|
|
213
|
-
id: options.id,
|
|
214
|
-
attributes: {
|
|
215
|
-
author: options.author,
|
|
216
|
-
copyright: options.copyright,
|
|
217
|
-
tags: normalizedTags,
|
|
218
|
-
notes: options.notes || null,
|
|
219
|
-
default_field_metadata: {
|
|
220
|
-
"en-GB": {
|
|
221
|
-
title: safeTitle,
|
|
222
|
-
alt: safeAlt,
|
|
223
|
-
custom_data: {
|
|
224
|
-
source: normalizedTags[0] || "uploaded-by-integrations",
|
|
225
|
-
tags: normalizedTags,
|
|
226
|
-
},
|
|
227
|
-
},
|
|
228
|
-
en: {
|
|
229
|
-
title: safeTitle,
|
|
230
|
-
alt: safeAlt,
|
|
231
|
-
custom_data: {
|
|
232
|
-
source: normalizedTags[0] || "uploaded-by-integrations",
|
|
233
|
-
tags: normalizedTags,
|
|
234
|
-
},
|
|
235
|
-
},
|
|
236
|
-
"en-US": {
|
|
237
|
-
title: safeTitle,
|
|
238
|
-
alt: safeAlt,
|
|
239
|
-
custom_data: {
|
|
240
|
-
source: normalizedTags[0] || "uploaded-by-integrations",
|
|
241
|
-
tags: normalizedTags,
|
|
242
|
-
},
|
|
243
|
-
},
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
|
-
},
|
|
247
|
-
};
|
|
248
|
-
if (options.uploadCollectionId) {
|
|
249
|
-
body.data.relationships = {
|
|
250
|
-
upload_collection: {
|
|
251
|
-
data: {
|
|
252
|
-
type: "upload_collection",
|
|
253
|
-
id: options.uploadCollectionId,
|
|
254
|
-
},
|
|
255
|
-
},
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
const response = await fetch(`${this.baseUrl}/uploads/${options.id}`, {
|
|
259
|
-
method: "PATCH",
|
|
260
|
-
headers: {
|
|
261
|
-
Authorization: `Bearer ${this.apiToken}`,
|
|
262
|
-
"X-Api-Version": "3",
|
|
263
|
-
"X-Environment": this.environment,
|
|
264
|
-
"Content-Type": "application/vnd.api+json",
|
|
265
|
-
Accept: "application/json",
|
|
266
|
-
},
|
|
267
|
-
body: JSON.stringify(body),
|
|
268
|
-
});
|
|
269
|
-
this.handle429(response);
|
|
270
|
-
if (!response.ok) {
|
|
271
|
-
const errorText = await response.text();
|
|
272
|
-
this.logging.error(`Failed to update upload: ${response.statusText} - ${errorText}`);
|
|
273
|
-
throw new Error(`Failed to update upload: ${response.statusText} - ${errorText}`);
|
|
274
|
-
}
|
|
275
|
-
const updated = await response.json();
|
|
276
|
-
if (Array.isArray(updated.data) && updated.data[0]?.type === "api_error") {
|
|
277
|
-
const errorCode = updated.data[0].attributes?.code || "UNKNOWN_ERROR";
|
|
278
|
-
const errorMsg = `DatoCMS API error: ${errorCode}`;
|
|
279
|
-
this.logging.error(errorMsg);
|
|
280
|
-
throw new Error(errorMsg);
|
|
281
|
-
}
|
|
282
|
-
if (updated.data?.type === "job") {
|
|
283
|
-
this.logging.log(`Waiting for job completion: ${updated.data.id}`);
|
|
284
|
-
const jobPayload = await this.waitForJobCompletion(updated.data.id);
|
|
285
|
-
const assetId = jobPayload?.data?.id;
|
|
286
|
-
const assetUrl = jobPayload?.data?.attributes?.url;
|
|
287
|
-
if (!assetId || !assetUrl) {
|
|
288
|
-
throw new Error(`Job completed but payload missing expected fields: ${JSON.stringify(jobPayload)}`);
|
|
289
|
-
}
|
|
290
|
-
this.logging.log(`Job completed for upload: ${assetId}`);
|
|
291
|
-
return { success: true, assetId, upload: assetUrl };
|
|
292
|
-
}
|
|
293
|
-
if (updated.data?.type === "upload") {
|
|
294
|
-
const { id, attributes } = updated.data;
|
|
295
|
-
this.logging.log(`Upload updated successfully: ${id}`);
|
|
296
|
-
return { success: true, assetId: id, upload: attributes.url };
|
|
297
|
-
}
|
|
298
|
-
const errMsg = `Unexpected update response: ${JSON.stringify(updated)}`;
|
|
299
|
-
this.logging.error(errMsg);
|
|
300
|
-
throw new Error(errMsg);
|
|
301
|
-
}
|
|
302
|
-
catch (err) {
|
|
303
|
-
const msg = err?.message ?? JSON.stringify(err);
|
|
304
|
-
this.logging.error(`[updateUpload] failed: ${msg}`);
|
|
305
|
-
throw new Error(msg);
|
|
306
|
-
}
|
|
307
|
-
};
|
|
308
158
|
async uploadFromUrl(options) {
|
|
309
|
-
const { url, filename, uploadCollectionId
|
|
159
|
+
const { url, filename, uploadCollectionId } = options;
|
|
310
160
|
this.logging.log(`Starting upload from URL: ${url}`);
|
|
311
161
|
const fileResponse = await fetch(url);
|
|
312
162
|
if (!fileResponse.ok) {
|
|
@@ -314,43 +164,9 @@ class DatoHelper extends runtime_1.default {
|
|
|
314
164
|
this.logging.error(errorMsg);
|
|
315
165
|
throw new Error(errorMsg);
|
|
316
166
|
}
|
|
317
|
-
let finalFilename = filename || path_1.default.basename(new URL(url).pathname) ||
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
const urlObj = new URL(url);
|
|
321
|
-
const pathname = urlObj.pathname;
|
|
322
|
-
if (pathname.includes(".")) {
|
|
323
|
-
const urlExtension = path_1.default.extname(pathname);
|
|
324
|
-
if (urlExtension) {
|
|
325
|
-
finalFilename += urlExtension;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
if (!path_1.default.extname(finalFilename) && fileResponse.headers.has('content-type')) {
|
|
329
|
-
const ext = (0, mime_types_1.extension)(fileResponse.headers.get('content-type'));
|
|
330
|
-
if (typeof ext === "string" && ext.length > 0) {
|
|
331
|
-
finalFilename += `.${ext}`;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
else if (!filename) {
|
|
336
|
-
if (!path_1.default.extname(finalFilename) && fileResponse.headers.has('content-type')) {
|
|
337
|
-
const ext = (0, mime_types_1.extension)(fileResponse.headers.get('content-type'));
|
|
338
|
-
if (typeof ext === "string" && ext.length > 0) {
|
|
339
|
-
finalFilename += `.${ext}`;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
if (skipCreationIfAlreadyExists) {
|
|
344
|
-
const existing = await this.findUploadByFilename(finalFilename);
|
|
345
|
-
if (existing) {
|
|
346
|
-
this.logging.log(`Skipping upload: existing asset found for "${finalFilename}"`);
|
|
347
|
-
return {
|
|
348
|
-
success: true,
|
|
349
|
-
assetId: existing.id,
|
|
350
|
-
upload: existing.attributes.url,
|
|
351
|
-
skipped: true,
|
|
352
|
-
};
|
|
353
|
-
}
|
|
167
|
+
let finalFilename = filename || path_1.default.basename(new URL(url).pathname) || 'bs-' + this.triggerId + '-' + new Date().getTime();
|
|
168
|
+
if (!path_1.default.extname(finalFilename) && fileResponse.headers.has('content-type')) {
|
|
169
|
+
finalFilename += `.${(0, mime_types_1.extension)(fileResponse.headers.get('content-type'))}`;
|
|
354
170
|
}
|
|
355
171
|
const uploadRequest = await this.requestUploadParameters(finalFilename);
|
|
356
172
|
const uploadId = uploadRequest.data.id;
|
|
@@ -367,7 +183,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
367
183
|
success: true,
|
|
368
184
|
upload: assetPayload.data.attributes.url,
|
|
369
185
|
assetId: assetPayload.data.id,
|
|
370
|
-
skipped: false,
|
|
371
186
|
};
|
|
372
187
|
}
|
|
373
188
|
async uploadFromFile(options) {
|
|
@@ -404,7 +219,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
404
219
|
'Accept': 'application/json',
|
|
405
220
|
},
|
|
406
221
|
});
|
|
407
|
-
this.handle429(response);
|
|
408
222
|
if (!response.ok) {
|
|
409
223
|
const errorText = await response.text();
|
|
410
224
|
this.logging.error(`Failed to fetch upload collections: ${response.statusText} - ${errorText}`);
|
|
@@ -450,14 +264,7 @@ class DatoHelper extends runtime_1.default {
|
|
|
450
264
|
}
|
|
451
265
|
async findUploadByFilename(filename) {
|
|
452
266
|
try {
|
|
453
|
-
|
|
454
|
-
this.logging.log(`findUploadByFilename called with invalid filename: ${String(filename)}`);
|
|
455
|
-
return null;
|
|
456
|
-
}
|
|
457
|
-
const normalizedTarget = filename.trim().toLowerCase().replace(/\.[^.]+$/, '');
|
|
458
|
-
const query = encodeURIComponent(normalizedTarget);
|
|
459
|
-
this.logging.log(`Searching uploads with query="${normalizedTarget}" for filename="${filename}"`);
|
|
460
|
-
const response = await fetch(`${this.baseUrl}/uploads?filter[query]=${query}&page[limit]=100`, {
|
|
267
|
+
const response = await fetch(`${this.baseUrl}/uploads?filter[filename]=${encodeURIComponent(filename)}`, {
|
|
461
268
|
headers: {
|
|
462
269
|
'Authorization': `Bearer ${this.apiToken}`,
|
|
463
270
|
'X-Api-Version': '3',
|
|
@@ -465,7 +272,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
465
272
|
'Accept': 'application/json',
|
|
466
273
|
},
|
|
467
274
|
});
|
|
468
|
-
this.handle429(response);
|
|
469
275
|
if (!response.ok) {
|
|
470
276
|
const errorText = await response.text();
|
|
471
277
|
this.logging.error(`Failed to search for existing upload: ${response.status} ${response.statusText} - ${errorText}`);
|
|
@@ -475,32 +281,10 @@ class DatoHelper extends runtime_1.default {
|
|
|
475
281
|
this.logging.error(`Failed to parse JSON in findUploadByFilename: ${err.message}`);
|
|
476
282
|
return null;
|
|
477
283
|
});
|
|
478
|
-
|
|
479
|
-
if (!uploads.length) {
|
|
480
|
-
this.logging.log(`No uploads returned for query="${normalizedTarget}"`);
|
|
481
|
-
return null;
|
|
482
|
-
}
|
|
483
|
-
const targetFull = filename.trim().toLowerCase();
|
|
484
|
-
const match = uploads.find((u) => {
|
|
485
|
-
const storedFull = u?.attributes?.filename?.toLowerCase();
|
|
486
|
-
if (!storedFull)
|
|
487
|
-
return false;
|
|
488
|
-
if (storedFull === targetFull)
|
|
489
|
-
return true;
|
|
490
|
-
const storedNormalized = storedFull.replace(/\.[^.]+$/, '');
|
|
491
|
-
if (storedNormalized === normalizedTarget)
|
|
492
|
-
return true;
|
|
493
|
-
return false;
|
|
494
|
-
});
|
|
495
|
-
if (match) {
|
|
496
|
-
this.logging.log(`Found existing upload for "${filename}" -> asset_id=${match.id}, storedFilename=${match.attributes?.filename}`);
|
|
497
|
-
return match;
|
|
498
|
-
}
|
|
499
|
-
this.logging.log(`No exact filename match found among ${uploads.length} uploads for "${filename}" (query="${normalizedTarget}")`);
|
|
500
|
-
return null;
|
|
284
|
+
return data?.data?.[0] || null;
|
|
501
285
|
}
|
|
502
286
|
catch (err) {
|
|
503
|
-
this.logging.error(`Error in findUploadByFilename: ${err
|
|
287
|
+
this.logging.error(`Error in findUploadByFilename: ${err.message}`);
|
|
504
288
|
return null;
|
|
505
289
|
}
|
|
506
290
|
}
|
|
@@ -515,7 +299,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
515
299
|
Accept: "application/json",
|
|
516
300
|
},
|
|
517
301
|
});
|
|
518
|
-
this.handle429(res);
|
|
519
302
|
if (!res.ok) {
|
|
520
303
|
const errorText = await res.text();
|
|
521
304
|
throw new Error(`Failed to fetch item types: ${res.status} ${res.statusText} - ${errorText}`);
|
|
@@ -543,7 +326,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
543
326
|
Accept: "application/json",
|
|
544
327
|
},
|
|
545
328
|
});
|
|
546
|
-
this.handle429(res);
|
|
547
329
|
if (!res.ok) {
|
|
548
330
|
const errorText = await res.text();
|
|
549
331
|
throw new Error(`Failed to fetch product by SKU: ${res.status} ${res.statusText} - ${errorText}`);
|
|
@@ -576,7 +358,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
576
358
|
},
|
|
577
359
|
}),
|
|
578
360
|
});
|
|
579
|
-
this.handle429(res);
|
|
580
361
|
if (!res.ok) {
|
|
581
362
|
const errorText = await res.text();
|
|
582
363
|
throw new Error(`Failed to create product: ${res.status} ${res.statusText} - ${errorText}`);
|
|
@@ -607,7 +388,6 @@ class DatoHelper extends runtime_1.default {
|
|
|
607
388
|
},
|
|
608
389
|
}),
|
|
609
390
|
});
|
|
610
|
-
this.handle429(res);
|
|
611
391
|
if (!res.ok) {
|
|
612
392
|
const errorText = await res.text();
|
|
613
393
|
throw new Error(`Failed to update product gallery: ${res.status} ${res.statusText} - ${errorText}`);
|
|
@@ -619,62 +399,5 @@ class DatoHelper extends runtime_1.default {
|
|
|
619
399
|
throw err;
|
|
620
400
|
}
|
|
621
401
|
}
|
|
622
|
-
async updateProductSwatch(productId, uploadId) {
|
|
623
|
-
try {
|
|
624
|
-
const res = await fetch(`${this.baseUrl}/items/${productId}`, {
|
|
625
|
-
method: "PATCH",
|
|
626
|
-
headers: {
|
|
627
|
-
Authorization: `Bearer ${this.apiToken}`,
|
|
628
|
-
"X-Api-Version": "3",
|
|
629
|
-
"X-Environment": this.environment,
|
|
630
|
-
"Content-Type": "application/vnd.api+json",
|
|
631
|
-
Accept: "application/json",
|
|
632
|
-
},
|
|
633
|
-
body: JSON.stringify({
|
|
634
|
-
data: {
|
|
635
|
-
type: "item",
|
|
636
|
-
id: productId,
|
|
637
|
-
attributes: {
|
|
638
|
-
swatch: { upload_id: uploadId },
|
|
639
|
-
},
|
|
640
|
-
},
|
|
641
|
-
}),
|
|
642
|
-
});
|
|
643
|
-
this.handle429(res);
|
|
644
|
-
if (!res.ok) {
|
|
645
|
-
const errorText = await res.text();
|
|
646
|
-
throw new Error(`Failed to update product swatch: ${res.status} ${res.statusText} - ${errorText}`);
|
|
647
|
-
}
|
|
648
|
-
return await res.json();
|
|
649
|
-
}
|
|
650
|
-
catch (err) {
|
|
651
|
-
this.logging.error(`updateProductSwatch failed: ${err.message}`);
|
|
652
|
-
throw err;
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
async publishProduct(productId) {
|
|
656
|
-
try {
|
|
657
|
-
const res = await fetch(`${this.baseUrl}/items/${productId}/publish`, {
|
|
658
|
-
method: "PUT",
|
|
659
|
-
headers: {
|
|
660
|
-
Authorization: `Bearer ${this.apiToken}`,
|
|
661
|
-
"X-Api-Version": "3",
|
|
662
|
-
"X-Environment": this.environment,
|
|
663
|
-
"Content-Type": "application/vnd.api+json",
|
|
664
|
-
Accept: "application/json",
|
|
665
|
-
},
|
|
666
|
-
});
|
|
667
|
-
this.handle429(res);
|
|
668
|
-
if (!res.ok) {
|
|
669
|
-
const errorText = await res.text();
|
|
670
|
-
throw new Error(`Failed to publish product: ${res.status} ${res.statusText} - ${errorText}`);
|
|
671
|
-
}
|
|
672
|
-
return await res.json();
|
|
673
|
-
}
|
|
674
|
-
catch (err) {
|
|
675
|
-
this.logging.error(`publishProduct failed: ${err.message}`);
|
|
676
|
-
throw err;
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
402
|
}
|
|
680
403
|
exports.default = DatoHelper;
|
|
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.RedisConnectionError = exports.RateLimit = exports.setHeaders = exports.DatoHelper = exports.AirtableHelper = exports.CentraHelper = exports.BigQueryHelper = exports.JWKSHelper = exports.CloudTasksHelper = exports.Secrets = exports.SchedulerHelper = exports.Logging = exports.Runtime = exports.PubSubHelper = exports.EnvEngine = exports.validate = void 0;
|
|
20
|
+
exports.RedisConnectionError = exports.RateLimit = exports.setHeaders = exports.BCOrderHelper = exports.DatoHelper = exports.AirtableHelper = exports.CentraHelper = exports.BigQueryHelper = exports.JWKSHelper = exports.CloudTasksHelper = exports.Secrets = exports.SchedulerHelper = exports.Logging = exports.Runtime = exports.PubSubHelper = exports.EnvEngine = exports.validate = void 0;
|
|
21
21
|
var validate_1 = require("./validate");
|
|
22
22
|
Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return __importDefault(validate_1).default; } });
|
|
23
23
|
__exportStar(require("./sanitize"), exports);
|
|
@@ -45,6 +45,8 @@ var airtable_1 = require("./airtable");
|
|
|
45
45
|
Object.defineProperty(exports, "AirtableHelper", { enumerable: true, get: function () { return __importDefault(airtable_1).default; } });
|
|
46
46
|
var dato_1 = require("./dato");
|
|
47
47
|
Object.defineProperty(exports, "DatoHelper", { enumerable: true, get: function () { return __importDefault(dato_1).default; } });
|
|
48
|
+
var bcOrder_1 = require("./bcOrder");
|
|
49
|
+
Object.defineProperty(exports, "BCOrderHelper", { enumerable: true, get: function () { return __importDefault(bcOrder_1).default; } });
|
|
48
50
|
var setHeaders_1 = require("./setHeaders");
|
|
49
51
|
Object.defineProperty(exports, "setHeaders", { enumerable: true, get: function () { return __importDefault(setHeaders_1).default; } });
|
|
50
52
|
var rateLimit_1 = require("./rateLimit");
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.default = validate;
|
|
7
7
|
const ajv_1 = __importDefault(require("ajv"));
|
|
8
8
|
const ajv_formats_1 = __importDefault(require("ajv-formats"));
|
|
9
|
+
const contracts_1 = require("../contracts");
|
|
9
10
|
function validate(payload, schema, options) {
|
|
10
11
|
const ajv = new ajv_1.default({
|
|
11
12
|
allErrors: true,
|
|
@@ -19,6 +20,33 @@ function validate(payload, schema, options) {
|
|
|
19
20
|
},
|
|
20
21
|
});
|
|
21
22
|
(0, ajv_formats_1.default)(ajv);
|
|
23
|
+
const schemas = [
|
|
24
|
+
contracts_1.Currency,
|
|
25
|
+
contracts_1.Country,
|
|
26
|
+
contracts_1.Money,
|
|
27
|
+
contracts_1.Total,
|
|
28
|
+
contracts_1.Order,
|
|
29
|
+
contracts_1.OrderAddress,
|
|
30
|
+
contracts_1.OrderCustomer,
|
|
31
|
+
contracts_1.OrderItem,
|
|
32
|
+
contracts_1.OrderPayment,
|
|
33
|
+
contracts_1.OrderShipment,
|
|
34
|
+
contracts_1.OrderShipmentItem,
|
|
35
|
+
contracts_1.OrderShipmentItemReturned,
|
|
36
|
+
contracts_1.OrderShipmentPOS,
|
|
37
|
+
contracts_1.OrderShipmentPOSOutbound,
|
|
38
|
+
contracts_1.OrderShipmentPOSReturn,
|
|
39
|
+
contracts_1.OrderShipmentShipped,
|
|
40
|
+
contracts_1.OrderShipmentShippedOutbound,
|
|
41
|
+
contracts_1.OrderShipmentShippedReturn,
|
|
42
|
+
].filter(Boolean);
|
|
43
|
+
for (const s of schemas) {
|
|
44
|
+
try {
|
|
45
|
+
ajv.addSchema(s);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
}
|
|
49
|
+
}
|
|
22
50
|
const validate = ajv.compile(schema);
|
|
23
51
|
if (!validate(payload)) {
|
|
24
52
|
const errors = validate.errors?.map(error => `${error.instancePath} ${error.message}: ${JSON.stringify({
|
|
@@ -35,6 +63,12 @@ function validate(payload, schema, options) {
|
|
|
35
63
|
errors.join('\n'));
|
|
36
64
|
}
|
|
37
65
|
else {
|
|
66
|
+
try {
|
|
67
|
+
options.log.log('Validation succeeded');
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
void 0;
|
|
71
|
+
}
|
|
38
72
|
return payload;
|
|
39
73
|
}
|
|
40
74
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { default as Currency } from './currency.schema.json';
|
|
2
|
+
export { default as Country } from './country.schema.json';
|
|
3
|
+
export { default as Money } from './money.schema.json';
|
|
4
|
+
export { default as Total } from './total.schema.json';
|
|
5
|
+
export { default as ProductDraft } from './product-draft.schema.json';
|
|
6
|
+
export { default as Product } from './product.schema.json';
|
|
7
|
+
export { default as ProductCategory } from './product-category.schema.json';
|
|
8
|
+
export { default as Category } from './category.schema.json';
|
|
9
|
+
export { default as DevelopmentColour } from './development-colour.schema.json';
|
|
10
|
+
export { default as Asset } from './asset.schema.json';
|
|
11
|
+
export { default as CustomerSegment } from './customer-segment.schema.json';
|
|
12
|
+
export { default as MarketingPref } from './marketing-preferences.schema.json';
|
|
13
|
+
export * from './order';
|
|
14
|
+
export { default as Order } from './order.schema.json';
|
|
15
|
+
export * from './messages';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as MessageProductDraft } from './product-draft.schema.json';
|
|
2
|
+
export { default as MessageEanChange } from './ean-change.schema.json';
|
|
3
|
+
export { default as MessageProductChange } from './product.schema.json';
|
|
4
|
+
export { default as MessageProductCategory } from './product-category.schema.json';
|
|
5
|
+
export * from './order';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as MessageOrderDelivered } from './delivered.schema.json';
|
|
2
|
+
export { default as MessageOrderNew } from './new.schema.json';
|
|
3
|
+
export { default as MessageOrderProcessed } from './processed.schema.json';
|
|
4
|
+
export { default as MessageOrderReturnInitiated } from './return-initiated.schema.json';
|
|
5
|
+
export { default as MessageOrderReturned } from './returned.schema.json';
|
|
6
|
+
export { default as MessageOrderShipped } from './shipped.schema.json';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as OrderAddress } from './address.schema.json';
|
|
2
|
+
export { default as OrderCustomer } from './customer.schema.json';
|
|
3
|
+
export { default as OrderItem } from './item.schema.json';
|
|
4
|
+
export { default as OrderPayment } from './payment.schema.json';
|
|
5
|
+
export { default as OrderShipment } from './shipment.schema.json';
|
|
6
|
+
export * from './shipment';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as OrderShipmentItem } from './item.schema.json';
|
|
2
|
+
export { default as OrderShipmentPOS } from './pos.schema.json';
|
|
3
|
+
export { default as OrderShipmentShipped } from './shipped.schema.json';
|
|
4
|
+
export * from './item';
|
|
5
|
+
export * from './pos';
|
|
6
|
+
export * from './shipped';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as OrderShipmentItemReturned } from './returned.schema.json';
|