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
- baseURL: '={{$credentials.baseUrl}}',
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
- // Debug Options
613
+ // Options
614
614
  {
615
- displayName: 'Debug Options',
616
- name: 'debugOptions',
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: 'Raw Mode',
623
- name: 'rawMode',
624
- type: 'boolean',
625
- default: false,
626
- description: 'Return raw PrestaShop XML format instead of simplified JSON. Useful for debugging and accessing all original data fields.',
627
- },
628
- {
629
- displayName: 'Show Request URL',
630
- name: 'showUrl',
631
- type: 'boolean',
632
- default: false,
633
- description: 'Add request URL to the response',
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: 'Show Request Info',
637
- name: 'showHeaders',
638
- type: 'boolean',
639
- default: false,
640
- description: 'Add complete HTTP request information to the response (method, URL, headers, authentication, body, etc.) - useful for debugging API communication',
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
- const response = await helpers.httpRequest(options);
76
- return {
77
- response,
78
- debugInfo,
79
- url: requestUrl,
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('debugOptions.rawMode', i, false);
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
- // Handle display parameter - minimal = no display param (IDs only)
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 options = {
297
- method: 'GET',
298
- url: requestUrl,
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: options.headers,
323
- timeout: options.timeout || 30000,
324
- transformResponse: [(data) => data] // Keep raw response
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
- response = axiosResponse.data;
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 (error.response) {
330
- response = error.response.data;
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
- response = await this.helpers.httpRequest(options);
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('debugOptions.timeout', i, 30000);
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
- responseData = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource, currentMode);
359
- break;
360
- }
361
- case 'search': {
362
- const filtersParam = this.getNodeParameter('filters', i, {});
363
- const advancedOptions = this.getNodeParameter('advancedOptions', i, {});
364
- const display = this.getNodeParameter('display', i, 'full');
365
- const customFields = this.getNodeParameter('customFields', i, '');
366
- const filters = filtersParam.filter || [];
367
- // Handle display parameter - minimal = no display param (IDs only)
368
- const displayValue = (0, utils_1.processDisplayParameter)(display, resource, customFields);
369
- requestUrl = (0, utils_1.buildUrlWithFilters)(`${credentials.baseUrl}/${resource}`, {
370
- filters,
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('debugOptions.timeout', i, 30000);
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
- responseData = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource, currentMode);
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('debugOptions.timeout', i, 30000);
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
- responseData = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource, currentMode);
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('debugOptions.timeout', i, 30000);
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
- responseData = {
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 debugOptions = this.getNodeParameter('debugOptions', i, {});
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 (debugOptions.showHeaders && Object.keys(requestDebugInfo).length === 0) {
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
- ...buildHeaders(rawMode),
493
- 'Authorization': `Basic ${Buffer.from(credentials.apiKey + ':').toString('base64')}`,
494
- 'User-Agent': 'n8n-prestashop8-node/1.0.0',
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 (debugOptions.showUrl || debugOptions.showHeaders) {
716
+ if (showRequestUrl || showRequestInfo) {
509
717
  responseData = {
510
718
  data: responseData,
511
- ...(debugOptions.showUrl && { requestUrl }),
512
- ...(debugOptions.showHeaders && { requestInfo: requestDebugInfo }),
719
+ ...(showRequestUrl && { requestUrl }),
720
+ ...(showRequestInfo && { requestInfo: requestDebugInfo }),
513
721
  };
514
722
  }
515
723
  processResponseData(responseData, returnData, i);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-prestashop8",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "description": "Nœud n8n personnalisé pour PrestaShop 8 avec support CRUD complet et conversion XML/JSON automatique",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",