n8n-nodes-prestashop8 1.1.2 → 1.2.0
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.
|
@@ -46,12 +46,8 @@ class PrestaShop8Api {
|
|
|
46
46
|
};
|
|
47
47
|
this.test = {
|
|
48
48
|
request: {
|
|
49
|
-
|
|
50
|
-
url: '/',
|
|
49
|
+
url: '={{$credentials.baseUrl}}/products?display=[id]&limit=1',
|
|
51
50
|
method: 'GET',
|
|
52
|
-
headers: {
|
|
53
|
-
'Output-Format': 'JSON',
|
|
54
|
-
},
|
|
55
51
|
},
|
|
56
52
|
};
|
|
57
53
|
}
|
|
@@ -610,34 +610,66 @@ exports.PrestaShop8Description = {
|
|
|
610
610
|
],
|
|
611
611
|
description: 'Fields to update in the resource. Add multiple field/value pairs as needed. For multilingual fields (names, descriptions), use format: fieldname-langid (e.g., name-1, name-2 for different languages).',
|
|
612
612
|
},
|
|
613
|
-
//
|
|
613
|
+
// Options
|
|
614
614
|
{
|
|
615
|
-
displayName: '
|
|
616
|
-
name: '
|
|
615
|
+
displayName: 'Options',
|
|
616
|
+
name: 'options',
|
|
617
617
|
type: 'collection',
|
|
618
|
-
default: {},
|
|
619
618
|
placeholder: 'Add Option',
|
|
619
|
+
default: {},
|
|
620
620
|
options: [
|
|
621
621
|
{
|
|
622
|
-
displayName: '
|
|
623
|
-
name: '
|
|
624
|
-
type: '
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
622
|
+
displayName: 'Request',
|
|
623
|
+
name: 'request',
|
|
624
|
+
type: 'collection',
|
|
625
|
+
placeholder: 'Add Request Option',
|
|
626
|
+
default: {},
|
|
627
|
+
options: [
|
|
628
|
+
{
|
|
629
|
+
displayName: 'Show Request Info',
|
|
630
|
+
name: 'showRequestInfo',
|
|
631
|
+
type: 'boolean',
|
|
632
|
+
default: false,
|
|
633
|
+
description: 'Add complete HTTP request information to the response (method, URL, headers, authentication, body, etc.) - useful for debugging API communication',
|
|
634
|
+
},
|
|
635
|
+
{
|
|
636
|
+
displayName: 'Show Request URL',
|
|
637
|
+
name: 'showRequestUrl',
|
|
638
|
+
type: 'boolean',
|
|
639
|
+
default: false,
|
|
640
|
+
description: 'Add the complete request URL to the response - useful for debugging API calls',
|
|
641
|
+
},
|
|
642
|
+
],
|
|
634
643
|
},
|
|
635
644
|
{
|
|
636
|
-
displayName: '
|
|
637
|
-
name: '
|
|
638
|
-
type: '
|
|
639
|
-
|
|
640
|
-
|
|
645
|
+
displayName: 'Response',
|
|
646
|
+
name: 'response',
|
|
647
|
+
type: 'collection',
|
|
648
|
+
placeholder: 'Add Response Option',
|
|
649
|
+
default: {},
|
|
650
|
+
options: [
|
|
651
|
+
{
|
|
652
|
+
displayName: 'Include Response Headers and Status',
|
|
653
|
+
name: 'includeResponseHeaders',
|
|
654
|
+
type: 'boolean',
|
|
655
|
+
default: false,
|
|
656
|
+
description: 'Whether to return the full response (headers and response status code) data instead of only the body',
|
|
657
|
+
},
|
|
658
|
+
{
|
|
659
|
+
displayName: 'Never Error',
|
|
660
|
+
name: 'neverError',
|
|
661
|
+
type: 'boolean',
|
|
662
|
+
default: false,
|
|
663
|
+
description: 'Whether to succeeds also when status code is not 2xx',
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
displayName: 'Raw Mode',
|
|
667
|
+
name: 'rawMode',
|
|
668
|
+
type: 'boolean',
|
|
669
|
+
default: false,
|
|
670
|
+
description: 'Return raw PrestaShop XML/JSON response without n8n processing - useful for debugging or custom XML handling',
|
|
671
|
+
},
|
|
672
|
+
],
|
|
641
673
|
},
|
|
642
674
|
{
|
|
643
675
|
displayName: 'Timeout (ms)',
|
|
@@ -67,17 +67,41 @@ function buildHttpOptions(method, url, credentials, rawMode, timeout, body) {
|
|
|
67
67
|
};
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
|
-
* Execute HTTP request with debug capture
|
|
70
|
+
* Execute HTTP request with debug capture and response metadata
|
|
71
71
|
*/
|
|
72
|
-
async function executeHttpRequest(helpers, options, credentials, rawMode, operation, resource, body) {
|
|
72
|
+
async function executeHttpRequest(helpers, options, credentials, rawMode, operation, resource, neverError = false, body) {
|
|
73
|
+
var _a, _b, _c, _d;
|
|
73
74
|
const requestUrl = options.url;
|
|
74
75
|
const debugInfo = captureRequestDebugInfo(options, credentials, rawMode, operation, resource, body);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
response,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
try {
|
|
77
|
+
const response = await helpers.httpRequest(options);
|
|
78
|
+
// For n8n's httpRequest, the response IS the body, headers are not directly available
|
|
79
|
+
// We return the response as-is since n8n handles the HTTP layer
|
|
80
|
+
return {
|
|
81
|
+
response,
|
|
82
|
+
debugInfo,
|
|
83
|
+
url: requestUrl,
|
|
84
|
+
responseHeaders: {},
|
|
85
|
+
statusCode: 200, // Assume success if no error thrown
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (neverError) {
|
|
90
|
+
// Return structured error response for Never Error mode
|
|
91
|
+
const errorResponse = {
|
|
92
|
+
status: error.httpCode || ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) || 500,
|
|
93
|
+
message: ((_b = error.response) === null || _b === void 0 ? void 0 : _b.data) || ''
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
response: errorResponse,
|
|
97
|
+
debugInfo,
|
|
98
|
+
url: requestUrl,
|
|
99
|
+
responseHeaders: ((_c = error.response) === null || _c === void 0 ? void 0 : _c.headers) || {},
|
|
100
|
+
statusCode: error.httpCode || ((_d = error.response) === null || _d === void 0 ? void 0 : _d.status) || 500,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
81
105
|
}
|
|
82
106
|
/**
|
|
83
107
|
* Collect required fields from individual input parameters
|
|
@@ -266,6 +290,7 @@ class PrestaShop8 {
|
|
|
266
290
|
};
|
|
267
291
|
}
|
|
268
292
|
async execute() {
|
|
293
|
+
var _a, _b, _c, _d;
|
|
269
294
|
const items = this.getInputData();
|
|
270
295
|
const returnData = [];
|
|
271
296
|
const credentials = await this.getCredentials('prestaShop8Api');
|
|
@@ -278,7 +303,7 @@ class PrestaShop8 {
|
|
|
278
303
|
let requestUrl = '';
|
|
279
304
|
let requestHeaders = {};
|
|
280
305
|
let requestDebugInfo = {};
|
|
281
|
-
const rawMode = this.getNodeParameter('
|
|
306
|
+
const rawMode = this.getNodeParameter('options.response.rawMode', i, false);
|
|
282
307
|
// Use resource for response processing
|
|
283
308
|
const currentMode = resource;
|
|
284
309
|
switch (operation) {
|
|
@@ -286,28 +311,15 @@ class PrestaShop8 {
|
|
|
286
311
|
const advancedOptions = this.getNodeParameter('advancedOptions', i, {});
|
|
287
312
|
const display = this.getNodeParameter('display', i, 'full');
|
|
288
313
|
const customFields = this.getNodeParameter('customFields', i, '');
|
|
289
|
-
|
|
290
|
-
const displayValue = (0, utils_1.processDisplayParameter)(display, resource, customFields);
|
|
314
|
+
const displayValue = display === 'custom' ? customFields : display;
|
|
291
315
|
requestUrl = (0, utils_1.buildUrlWithFilters)(`${credentials.baseUrl}/${resource}`, {
|
|
292
316
|
limit: advancedOptions.limit,
|
|
293
317
|
sort: advancedOptions.sort,
|
|
294
318
|
display: displayValue,
|
|
295
319
|
}, rawMode);
|
|
296
|
-
const
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
auth: {
|
|
300
|
-
username: credentials.apiKey,
|
|
301
|
-
password: '',
|
|
302
|
-
},
|
|
303
|
-
headers: buildHeaders(rawMode),
|
|
304
|
-
timeout: this.getNodeParameter('debugOptions.timeout', i, 30000),
|
|
305
|
-
...(rawMode ? { json: false } : {}),
|
|
306
|
-
};
|
|
307
|
-
// Capture complete request information for debug
|
|
308
|
-
requestDebugInfo = captureRequestDebugInfo(options, credentials, rawMode, operation, resource);
|
|
309
|
-
requestHeaders = requestDebugInfo.headers;
|
|
310
|
-
let response;
|
|
320
|
+
const timeout = this.getNodeParameter('options.timeout', i, 30000);
|
|
321
|
+
const neverError = this.getNodeParameter('options.response.neverError', i, false);
|
|
322
|
+
const includeResponseHeaders = this.getNodeParameter('options.response.includeResponseHeaders', i, false);
|
|
311
323
|
if (rawMode) {
|
|
312
324
|
// In Raw mode, use axios directly to avoid n8n automatic parsing
|
|
313
325
|
const axios = require('axios');
|
|
@@ -319,15 +331,47 @@ class PrestaShop8 {
|
|
|
319
331
|
username: credentials.apiKey,
|
|
320
332
|
password: ''
|
|
321
333
|
},
|
|
322
|
-
headers:
|
|
323
|
-
timeout:
|
|
324
|
-
transformResponse: [(data) => data]
|
|
334
|
+
headers: buildHeaders(rawMode),
|
|
335
|
+
timeout: timeout || 30000,
|
|
336
|
+
transformResponse: [(data) => data],
|
|
337
|
+
validateStatus: neverError ? () => true : undefined // Accept all status codes if neverError is true
|
|
325
338
|
});
|
|
326
|
-
|
|
339
|
+
requestDebugInfo = captureRequestDebugInfo({
|
|
340
|
+
method: 'GET',
|
|
341
|
+
url: requestUrl,
|
|
342
|
+
headers: buildHeaders(rawMode),
|
|
343
|
+
timeout: timeout
|
|
344
|
+
}, credentials, rawMode, operation, resource);
|
|
345
|
+
requestHeaders = requestDebugInfo.headers;
|
|
346
|
+
// Check if this is an error response with Never Error mode
|
|
347
|
+
if (neverError && (axiosResponse.status < 200 || axiosResponse.status >= 300)) {
|
|
348
|
+
responseData = {
|
|
349
|
+
status: axiosResponse.status,
|
|
350
|
+
message: axiosResponse.data || ''
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
let processedResponse = { raw: axiosResponse.data };
|
|
355
|
+
// Add response headers and status if requested
|
|
356
|
+
if (includeResponseHeaders) {
|
|
357
|
+
responseData = {
|
|
358
|
+
body: processedResponse,
|
|
359
|
+
headers: axiosResponse.headers,
|
|
360
|
+
statusCode: axiosResponse.status,
|
|
361
|
+
statusMessage: axiosResponse.status >= 200 && axiosResponse.status < 300 ? 'OK' : 'Error'
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
responseData = processedResponse;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
327
368
|
}
|
|
328
369
|
catch (error) {
|
|
329
|
-
if (
|
|
330
|
-
|
|
370
|
+
if (neverError) {
|
|
371
|
+
responseData = {
|
|
372
|
+
status: ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) || 500,
|
|
373
|
+
message: ((_b = error.response) === null || _b === void 0 ? void 0 : _b.data) || ''
|
|
374
|
+
};
|
|
331
375
|
}
|
|
332
376
|
else {
|
|
333
377
|
throw error;
|
|
@@ -335,9 +379,25 @@ class PrestaShop8 {
|
|
|
335
379
|
}
|
|
336
380
|
}
|
|
337
381
|
else {
|
|
338
|
-
|
|
382
|
+
const options = buildHttpOptions('GET', requestUrl, credentials, rawMode, timeout);
|
|
383
|
+
const { response, debugInfo, url, responseHeaders, statusCode } = await executeHttpRequest(this.helpers, options, credentials, rawMode, operation, resource, neverError);
|
|
384
|
+
requestUrl = url;
|
|
385
|
+
requestDebugInfo = debugInfo;
|
|
386
|
+
requestHeaders = debugInfo.headers;
|
|
387
|
+
let processedResponse = (0, utils_1.processResponseForMode)(response, resource, currentMode);
|
|
388
|
+
// Add response headers and status if requested
|
|
389
|
+
if (includeResponseHeaders) {
|
|
390
|
+
responseData = {
|
|
391
|
+
body: processedResponse,
|
|
392
|
+
headers: responseHeaders,
|
|
393
|
+
statusCode: statusCode,
|
|
394
|
+
statusMessage: statusCode && statusCode >= 200 && statusCode < 300 ? 'OK' : 'Error'
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
responseData = processedResponse;
|
|
399
|
+
}
|
|
339
400
|
}
|
|
340
|
-
responseData = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource, currentMode);
|
|
341
401
|
break;
|
|
342
402
|
}
|
|
343
403
|
case 'getById': {
|
|
@@ -349,42 +409,27 @@ class PrestaShop8 {
|
|
|
349
409
|
requestUrl = (0, utils_1.buildUrlWithFilters)(`${credentials.baseUrl}/${resource}/${id}`, {
|
|
350
410
|
display: advancedOptions.display === 'custom' ? advancedOptions.customFields : advancedOptions.display,
|
|
351
411
|
}, rawMode);
|
|
352
|
-
const timeout = this.getNodeParameter('
|
|
412
|
+
const timeout = this.getNodeParameter('options.timeout', i, 30000);
|
|
413
|
+
const neverError = this.getNodeParameter('options.response.neverError', i, false);
|
|
414
|
+
const includeResponseHeaders = this.getNodeParameter('options.response.includeResponseHeaders', i, false);
|
|
353
415
|
const options = buildHttpOptions('GET', requestUrl, credentials, rawMode, timeout);
|
|
354
|
-
const { response, debugInfo, url } = await executeHttpRequest(this.helpers, options, credentials, rawMode, operation, resource);
|
|
416
|
+
const { response, debugInfo, url, responseHeaders, statusCode } = await executeHttpRequest(this.helpers, options, credentials, rawMode, operation, resource, neverError);
|
|
355
417
|
requestUrl = url;
|
|
356
418
|
requestDebugInfo = debugInfo;
|
|
357
419
|
requestHeaders = debugInfo.headers;
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
limit: advancedOptions.limit,
|
|
372
|
-
sort: advancedOptions.sort,
|
|
373
|
-
display: displayValue,
|
|
374
|
-
}, rawMode);
|
|
375
|
-
const options = {
|
|
376
|
-
method: 'GET',
|
|
377
|
-
url: requestUrl,
|
|
378
|
-
auth: {
|
|
379
|
-
username: credentials.apiKey,
|
|
380
|
-
password: '',
|
|
381
|
-
},
|
|
382
|
-
headers: buildHeaders(rawMode),
|
|
383
|
-
timeout: this.getNodeParameter('debugOptions.timeout', i, 30000),
|
|
384
|
-
...(rawMode ? { json: false } : {}),
|
|
385
|
-
};
|
|
386
|
-
const response = await this.helpers.httpRequest(options);
|
|
387
|
-
responseData = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource, currentMode);
|
|
420
|
+
let processedResponse = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource, currentMode);
|
|
421
|
+
// Add response headers and status if requested
|
|
422
|
+
if (includeResponseHeaders) {
|
|
423
|
+
responseData = {
|
|
424
|
+
body: processedResponse,
|
|
425
|
+
headers: responseHeaders,
|
|
426
|
+
statusCode: statusCode,
|
|
427
|
+
statusMessage: statusCode && statusCode >= 200 && statusCode < 300 ? 'OK' : 'Error'
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
responseData = processedResponse;
|
|
432
|
+
}
|
|
388
433
|
break;
|
|
389
434
|
}
|
|
390
435
|
case 'create': {
|
|
@@ -416,13 +461,27 @@ class PrestaShop8 {
|
|
|
416
461
|
}
|
|
417
462
|
// Build XML using new format
|
|
418
463
|
body = (0, utils_1.buildCreateXml)(resource, fieldsToCreate);
|
|
419
|
-
const timeout = this.getNodeParameter('
|
|
464
|
+
const timeout = this.getNodeParameter('options.timeout', i, 30000);
|
|
465
|
+
const neverError = this.getNodeParameter('options.response.neverError', i, false);
|
|
466
|
+
const includeResponseHeaders = this.getNodeParameter('options.response.includeResponseHeaders', i, false);
|
|
420
467
|
const options = buildHttpOptions('POST', `${credentials.baseUrl}/${resource}`, credentials, rawMode, timeout, body);
|
|
421
|
-
const { response, debugInfo, url } = await executeHttpRequest(this.helpers, options, credentials, rawMode, operation, resource, body);
|
|
468
|
+
const { response, debugInfo, url, responseHeaders, statusCode } = await executeHttpRequest(this.helpers, options, credentials, rawMode, operation, resource, neverError, body);
|
|
422
469
|
requestUrl = url;
|
|
423
470
|
requestDebugInfo = debugInfo;
|
|
424
471
|
requestHeaders = debugInfo.headers;
|
|
425
|
-
|
|
472
|
+
let processedResponse = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource, currentMode);
|
|
473
|
+
// Add response headers and status if requested
|
|
474
|
+
if (includeResponseHeaders) {
|
|
475
|
+
responseData = {
|
|
476
|
+
body: processedResponse,
|
|
477
|
+
headers: responseHeaders,
|
|
478
|
+
statusCode: statusCode,
|
|
479
|
+
statusMessage: statusCode && statusCode >= 200 && statusCode < 300 ? 'OK' : 'Error'
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
responseData = processedResponse;
|
|
484
|
+
}
|
|
426
485
|
break;
|
|
427
486
|
}
|
|
428
487
|
case 'update': {
|
|
@@ -450,13 +509,154 @@ class PrestaShop8 {
|
|
|
450
509
|
}
|
|
451
510
|
// Build XML using new format
|
|
452
511
|
body = (0, utils_1.buildUpdateXml)(resource, id, fieldsToUpdate);
|
|
453
|
-
const timeout = this.getNodeParameter('
|
|
512
|
+
const timeout = this.getNodeParameter('options.timeout', i, 30000);
|
|
513
|
+
const neverError = this.getNodeParameter('options.response.neverError', i, false);
|
|
514
|
+
const includeResponseHeaders = this.getNodeParameter('options.response.includeResponseHeaders', i, false);
|
|
454
515
|
const options = buildHttpOptions('PATCH', `${credentials.baseUrl}/${resource}/${id}`, credentials, rawMode, timeout, body);
|
|
455
|
-
const { response, debugInfo, url } = await executeHttpRequest(this.helpers, options, credentials, rawMode, operation, resource, body);
|
|
516
|
+
const { response, debugInfo, url, responseHeaders, statusCode } = await executeHttpRequest(this.helpers, options, credentials, rawMode, operation, resource, neverError, body);
|
|
456
517
|
requestUrl = url;
|
|
457
518
|
requestDebugInfo = debugInfo;
|
|
458
519
|
requestHeaders = debugInfo.headers;
|
|
459
|
-
|
|
520
|
+
let processedResponse = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource, currentMode);
|
|
521
|
+
// Add response headers and status if requested
|
|
522
|
+
if (includeResponseHeaders) {
|
|
523
|
+
responseData = {
|
|
524
|
+
body: processedResponse,
|
|
525
|
+
headers: responseHeaders,
|
|
526
|
+
statusCode: statusCode,
|
|
527
|
+
statusMessage: statusCode && statusCode >= 200 && statusCode < 300 ? 'OK' : 'Error'
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
else {
|
|
531
|
+
responseData = processedResponse;
|
|
532
|
+
}
|
|
533
|
+
break;
|
|
534
|
+
}
|
|
535
|
+
case 'search': {
|
|
536
|
+
const filtersParam = this.getNodeParameter('filters', i, {});
|
|
537
|
+
const advancedOptions = this.getNodeParameter('advancedOptions', i, {});
|
|
538
|
+
const display = this.getNodeParameter('display', i, 'full');
|
|
539
|
+
const customFields = this.getNodeParameter('customFields', i, '');
|
|
540
|
+
const filters = filtersParam.filter || [];
|
|
541
|
+
if (!filters.length) {
|
|
542
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'At least one filter is required for search');
|
|
543
|
+
}
|
|
544
|
+
// Build filter parameters for URL
|
|
545
|
+
const filterParams = {};
|
|
546
|
+
for (const filter of filters) {
|
|
547
|
+
if (filter.value && filter.value.trim()) {
|
|
548
|
+
const key = `filter[${filter.field}]`;
|
|
549
|
+
// Handle different operators
|
|
550
|
+
switch (filter.operator) {
|
|
551
|
+
case 'equals':
|
|
552
|
+
filterParams[key] = `[${filter.value}]`;
|
|
553
|
+
break;
|
|
554
|
+
case 'contains':
|
|
555
|
+
filterParams[key] = `[${filter.value}]%`;
|
|
556
|
+
break;
|
|
557
|
+
case 'starts_with':
|
|
558
|
+
filterParams[key] = `[${filter.value}]%`;
|
|
559
|
+
break;
|
|
560
|
+
case 'greater_than':
|
|
561
|
+
filterParams[key] = `[${filter.value},]`;
|
|
562
|
+
break;
|
|
563
|
+
case 'less_than':
|
|
564
|
+
filterParams[key] = `[,${filter.value}]`;
|
|
565
|
+
break;
|
|
566
|
+
default:
|
|
567
|
+
filterParams[key] = `[${filter.value}]`;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
// Handle display parameter
|
|
572
|
+
const displayValue = (0, utils_1.processDisplayParameter)(display, resource, customFields);
|
|
573
|
+
requestUrl = (0, utils_1.buildUrlWithFilters)(`${credentials.baseUrl}/${resource}`, {
|
|
574
|
+
...filterParams,
|
|
575
|
+
limit: advancedOptions.limit,
|
|
576
|
+
sort: advancedOptions.sort,
|
|
577
|
+
display: displayValue,
|
|
578
|
+
}, rawMode);
|
|
579
|
+
const timeout = this.getNodeParameter('options.timeout', i, 30000);
|
|
580
|
+
const neverError = this.getNodeParameter('options.response.neverError', i, false);
|
|
581
|
+
const includeResponseHeaders = this.getNodeParameter('options.response.includeResponseHeaders', i, false);
|
|
582
|
+
if (rawMode) {
|
|
583
|
+
// In Raw mode, use axios directly to avoid n8n automatic parsing
|
|
584
|
+
const axios = require('axios');
|
|
585
|
+
try {
|
|
586
|
+
const axiosResponse = await axios({
|
|
587
|
+
method: 'GET',
|
|
588
|
+
url: requestUrl,
|
|
589
|
+
auth: {
|
|
590
|
+
username: credentials.apiKey,
|
|
591
|
+
password: ''
|
|
592
|
+
},
|
|
593
|
+
headers: buildHeaders(rawMode),
|
|
594
|
+
timeout: timeout || 30000,
|
|
595
|
+
transformResponse: [(data) => data],
|
|
596
|
+
validateStatus: neverError ? () => true : undefined // Accept all status codes if neverError is true
|
|
597
|
+
});
|
|
598
|
+
requestDebugInfo = captureRequestDebugInfo({
|
|
599
|
+
method: 'GET',
|
|
600
|
+
url: requestUrl,
|
|
601
|
+
headers: buildHeaders(rawMode),
|
|
602
|
+
timeout: timeout
|
|
603
|
+
}, credentials, rawMode, operation, resource);
|
|
604
|
+
requestHeaders = requestDebugInfo.headers;
|
|
605
|
+
// Check if this is an error response with Never Error mode
|
|
606
|
+
if (neverError && (axiosResponse.status < 200 || axiosResponse.status >= 300)) {
|
|
607
|
+
responseData = {
|
|
608
|
+
status: axiosResponse.status,
|
|
609
|
+
message: axiosResponse.data || ''
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
else {
|
|
613
|
+
let processedResponse = { raw: axiosResponse.data };
|
|
614
|
+
// Add response headers and status if requested
|
|
615
|
+
if (includeResponseHeaders) {
|
|
616
|
+
responseData = {
|
|
617
|
+
body: processedResponse,
|
|
618
|
+
headers: axiosResponse.headers,
|
|
619
|
+
statusCode: axiosResponse.status,
|
|
620
|
+
statusMessage: axiosResponse.status >= 200 && axiosResponse.status < 300 ? 'OK' : 'Error'
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
else {
|
|
624
|
+
responseData = processedResponse;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
catch (error) {
|
|
629
|
+
if (neverError) {
|
|
630
|
+
responseData = {
|
|
631
|
+
status: ((_c = error.response) === null || _c === void 0 ? void 0 : _c.status) || 500,
|
|
632
|
+
message: ((_d = error.response) === null || _d === void 0 ? void 0 : _d.data) || ''
|
|
633
|
+
};
|
|
634
|
+
}
|
|
635
|
+
else {
|
|
636
|
+
throw error;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
else {
|
|
641
|
+
const options = buildHttpOptions('GET', requestUrl, credentials, rawMode, timeout);
|
|
642
|
+
const { response, debugInfo, url, responseHeaders, statusCode } = await executeHttpRequest(this.helpers, options, credentials, rawMode, operation, resource, neverError);
|
|
643
|
+
requestUrl = url;
|
|
644
|
+
requestDebugInfo = debugInfo;
|
|
645
|
+
requestHeaders = debugInfo.headers;
|
|
646
|
+
let processedResponse = (0, utils_1.processResponseForMode)(response, resource, currentMode);
|
|
647
|
+
// Add response headers and status if requested
|
|
648
|
+
if (includeResponseHeaders) {
|
|
649
|
+
responseData = {
|
|
650
|
+
body: processedResponse,
|
|
651
|
+
headers: responseHeaders,
|
|
652
|
+
statusCode: statusCode,
|
|
653
|
+
statusMessage: statusCode && statusCode >= 200 && statusCode < 300 ? 'OK' : 'Error'
|
|
654
|
+
};
|
|
655
|
+
}
|
|
656
|
+
else {
|
|
657
|
+
responseData = processedResponse;
|
|
658
|
+
}
|
|
659
|
+
}
|
|
460
660
|
break;
|
|
461
661
|
}
|
|
462
662
|
case 'delete': {
|
|
@@ -464,52 +664,60 @@ class PrestaShop8 {
|
|
|
464
664
|
if (!id) {
|
|
465
665
|
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'ID required for this operation');
|
|
466
666
|
}
|
|
467
|
-
const timeout = this.getNodeParameter('
|
|
667
|
+
const timeout = this.getNodeParameter('options.timeout', i, 30000);
|
|
668
|
+
const neverError = this.getNodeParameter('options.response.neverError', i, false);
|
|
669
|
+
const includeResponseHeaders = this.getNodeParameter('options.response.includeResponseHeaders', i, false);
|
|
468
670
|
const options = buildHttpOptions('DELETE', `${credentials.baseUrl}/${resource}/${id}`, credentials, rawMode, timeout);
|
|
469
|
-
const { debugInfo, url } = await executeHttpRequest(this.helpers, options, credentials, rawMode, operation, resource);
|
|
671
|
+
const { debugInfo, url, responseHeaders, statusCode } = await executeHttpRequest(this.helpers, options, credentials, rawMode, operation, resource, neverError);
|
|
470
672
|
requestUrl = url;
|
|
471
673
|
requestDebugInfo = debugInfo;
|
|
472
674
|
requestHeaders = debugInfo.headers;
|
|
473
|
-
|
|
675
|
+
let deleteResponse = {
|
|
474
676
|
success: true,
|
|
475
677
|
message: `${resource} with ID ${id} deleted successfully`,
|
|
476
678
|
deletedId: id,
|
|
477
679
|
};
|
|
680
|
+
// Add response headers and status if requested
|
|
681
|
+
if (includeResponseHeaders) {
|
|
682
|
+
responseData = {
|
|
683
|
+
body: deleteResponse,
|
|
684
|
+
headers: responseHeaders,
|
|
685
|
+
statusCode: statusCode,
|
|
686
|
+
statusMessage: statusCode && statusCode >= 200 && statusCode < 300 ? 'OK' : 'Error'
|
|
687
|
+
};
|
|
688
|
+
}
|
|
689
|
+
else {
|
|
690
|
+
responseData = deleteResponse;
|
|
691
|
+
}
|
|
478
692
|
break;
|
|
479
693
|
}
|
|
480
694
|
default:
|
|
481
695
|
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Operation "${operation}" not supported`);
|
|
482
696
|
}
|
|
483
697
|
// Add debug metadata if requested
|
|
484
|
-
const
|
|
698
|
+
const showRequestUrl = this.getNodeParameter('options.request.showRequestUrl', i, false);
|
|
699
|
+
const showRequestInfo = this.getNodeParameter('options.request.showRequestInfo', i, false);
|
|
485
700
|
// Capture request information for debug purposes if needed
|
|
486
|
-
if (
|
|
701
|
+
if (showRequestInfo && Object.keys(requestDebugInfo).length === 0) {
|
|
487
702
|
// Fallback if no request debug info was captured
|
|
488
703
|
requestDebugInfo = {
|
|
489
704
|
method: 'GET',
|
|
490
705
|
url: requestUrl,
|
|
491
|
-
headers: {
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
},
|
|
496
|
-
authentication: {
|
|
497
|
-
type: 'Basic Auth',
|
|
498
|
-
username: credentials.apiKey,
|
|
499
|
-
password: '[HIDDEN]',
|
|
500
|
-
baseUrl: credentials.baseUrl,
|
|
501
|
-
},
|
|
502
|
-
operation: operation,
|
|
503
|
-
resource: resource,
|
|
504
|
-
mode: rawMode ? 'Raw XML' : 'JSON',
|
|
706
|
+
headers: {},
|
|
707
|
+
auth: 'Basic (hidden)',
|
|
708
|
+
timeout: 30000,
|
|
709
|
+
timestamp: new Date().toISOString(),
|
|
505
710
|
};
|
|
711
|
+
}
|
|
712
|
+
// Add headers to output if requested
|
|
713
|
+
if (showRequestInfo) {
|
|
506
714
|
requestHeaders = requestDebugInfo.headers;
|
|
507
715
|
}
|
|
508
|
-
if (
|
|
716
|
+
if (showRequestUrl || showRequestInfo) {
|
|
509
717
|
responseData = {
|
|
510
718
|
data: responseData,
|
|
511
|
-
...(
|
|
512
|
-
...(
|
|
719
|
+
...(showRequestUrl && { requestUrl }),
|
|
720
|
+
...(showRequestInfo && { requestInfo: requestDebugInfo }),
|
|
513
721
|
};
|
|
514
722
|
}
|
|
515
723
|
processResponseData(responseData, returnData, i);
|
package/package.json
CHANGED