n8n-nodes-innotes 2.0.18 → 2.0.20

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.
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
3
  * @author Marco
4
- * @date 2026-09-09
4
+ * @date 2026-09-14
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.InNotes = void 0;
@@ -283,8 +283,6 @@ class InNotes {
283
283
  const options = this.getNodeParameter('options', 0, {});
284
284
  const batchSize = options.batchSize || 10;
285
285
  const timeoutBetweenBatches = options.timeoutBetweenBatches || 1000;
286
- // Create a node instance to access the methods
287
- const nodeInstance = new InNotes();
288
286
  // Helper function to add delay between batches
289
287
  const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
290
288
  if (resource === 'job' && operation === 'batchExists') {
@@ -336,25 +334,25 @@ class InNotes {
336
334
  try {
337
335
  let responseData = {};
338
336
  if (resource === 'automation') {
339
- responseData = await nodeInstance.executeAutomationOperation(this, actualIndex, operation);
337
+ responseData = await InNotes.executeAutomationOperation(this, actualIndex, operation);
340
338
  }
341
339
  else if (resource === 'contact') {
342
- responseData = await nodeInstance.executeContactOperation(this, actualIndex, operation);
340
+ responseData = await InNotes.executeContactOperation(this, actualIndex, operation);
343
341
  }
344
342
  else if (resource === 'note') {
345
- responseData = await nodeInstance.executeNoteOperation(this, actualIndex, operation);
343
+ responseData = await InNotes.executeNoteOperation(this, actualIndex, operation);
346
344
  }
347
345
  else if (resource === 'job') {
348
- responseData = await nodeInstance.executeJobOperation(this, actualIndex, operation);
346
+ responseData = await InNotes.executeJobOperation(this, actualIndex, operation);
349
347
  }
350
348
  else if (resource === 'status') {
351
- responseData = await nodeInstance.executeStatusOperation(this, actualIndex, operation);
349
+ responseData = await InNotes.executeStatusOperation(this, actualIndex, operation);
352
350
  }
353
351
  else if (resource === 'tag') {
354
- responseData = await nodeInstance.executeTagOperation(this, actualIndex, operation);
352
+ responseData = await InNotes.executeTagOperation(this, actualIndex, operation);
355
353
  }
356
354
  else if (resource === 'user') {
357
- responseData = await nodeInstance.executeUserOperation(this, actualIndex, operation);
355
+ responseData = await InNotes.executeUserOperation(this, actualIndex, operation);
358
356
  }
359
357
  if (Array.isArray(responseData)) {
360
358
  returnData.push(...responseData);
@@ -378,11 +376,10 @@ class InNotes {
378
376
  }
379
377
  return [this.helpers.returnJsonArray(returnData)];
380
378
  }
381
- async executeAutomationOperation(executeFunctions, itemIndex, operation) {
379
+ static async executeAutomationOperation(executeFunctions, itemIndex, operation) {
382
380
  if (operation === 'getConfig') {
383
381
  try {
384
- const response = await apiRequest(executeFunctions, 'GET', '/api/automation/config');
385
- return response;
382
+ return await apiRequest(executeFunctions, 'GET', '/api/automation/config');
386
383
  }
387
384
  catch (error) {
388
385
  throw new n8n_workflow_1.NodeApiError(executeFunctions.getNode(), {
@@ -439,7 +436,7 @@ class InNotes {
439
436
  message: `The operation "${operation}" is not supported for resource "automation"!`,
440
437
  });
441
438
  }
442
- async executeContactOperation(executeFunctions, itemIndex, operation) {
439
+ static async executeContactOperation(executeFunctions, itemIndex, operation) {
443
440
  if (operation === 'create') {
444
441
  const name = executeFunctions.getNodeParameter('name', itemIndex);
445
442
  const linkedin_key = executeFunctions.getNodeParameter('linkedin_key', itemIndex);
@@ -462,8 +459,7 @@ class InNotes {
462
459
  ...(contact_details && { contact_details }),
463
460
  };
464
461
  try {
465
- const response = await apiRequest(executeFunctions, 'POST', '/api/contacts', { body });
466
- return response;
462
+ return await apiRequest(executeFunctions, 'POST', '/api/contacts', { body });
467
463
  }
468
464
  catch (error) {
469
465
  // The COUNT, never the values: this object is interpolated into a
@@ -480,8 +476,7 @@ class InNotes {
480
476
  }
481
477
  if (operation === 'get') {
482
478
  const contactId = executeFunctions.getNodeParameter('contactId', itemIndex);
483
- const response = await apiRequest(executeFunctions, 'GET', `/api/contacts/${contactId}`);
484
- return response;
479
+ return await apiRequest(executeFunctions, 'GET', `/api/contacts/${contactId}`);
485
480
  }
486
481
  if (operation === 'getAll') {
487
482
  const returnAll = executeFunctions.getNodeParameter('returnAll', itemIndex, false);
@@ -515,8 +510,7 @@ class InNotes {
515
510
  };
516
511
  if (contact_details === undefined)
517
512
  delete body.contact_details;
518
- const response = await apiRequest(executeFunctions, 'PUT', `/api/contacts/${contactId}`, { body });
519
- return response;
513
+ return await apiRequest(executeFunctions, 'PUT', `/api/contacts/${contactId}`, { body });
520
514
  }
521
515
  if (operation === 'delete') {
522
516
  const contactId = executeFunctions.getNodeParameter('contactId', itemIndex);
@@ -527,7 +521,7 @@ class InNotes {
527
521
  message: `The operation "${operation}" is not supported for resource "contact"!`,
528
522
  });
529
523
  }
530
- async executeNoteOperation(executeFunctions, itemIndex, operation) {
524
+ static async executeNoteOperation(executeFunctions, itemIndex, operation) {
531
525
  if (operation === 'create') {
532
526
  const content = executeFunctions.getNodeParameter('content', itemIndex);
533
527
  const contactId = executeFunctions.getNodeParameter('contactId', itemIndex);
@@ -539,19 +533,17 @@ class InNotes {
539
533
  ...(visibility && { visibility }),
540
534
  ...(ext_table_name && { ext_table_name }),
541
535
  };
542
- const response = await apiRequest(executeFunctions, 'POST', '/api/note', { body });
543
- return response;
536
+ return await apiRequest(executeFunctions, 'POST', '/api/note', { body });
544
537
  }
545
538
  if (operation === 'get') {
546
539
  const noteId = executeFunctions.getNodeParameter('noteId', itemIndex);
547
- const response = await apiRequest(executeFunctions, 'GET', `/api/note/${noteId}`);
548
- return response;
540
+ return await apiRequest(executeFunctions, 'GET', `/api/note/${noteId}`);
549
541
  }
550
542
  throw new n8n_workflow_1.NodeApiError(executeFunctions.getNode(), {
551
543
  message: `The operation "${operation}" is not supported for resource "note"!`,
552
544
  });
553
545
  }
554
- async executeJobOperation(executeFunctions, itemIndex, operation) {
546
+ static async executeJobOperation(executeFunctions, itemIndex, operation) {
555
547
  if (operation === 'create') {
556
548
  const name = executeFunctions.getNodeParameter('name', itemIndex);
557
549
  const company_name = executeFunctions.getNodeParameter('company_name', itemIndex);
@@ -585,8 +577,7 @@ class InNotes {
585
577
  ...(tags && { tags: tags.split(',').map((tag) => tag.trim()) }),
586
578
  };
587
579
  try {
588
- const response = await apiRequest(executeFunctions, 'POST', '/api/job', { body });
589
- return response;
580
+ return await apiRequest(executeFunctions, 'POST', '/api/job', { body });
590
581
  }
591
582
  catch (error) {
592
583
  throw new n8n_workflow_1.NodeApiError(executeFunctions.getNode(), {
@@ -597,8 +588,7 @@ class InNotes {
597
588
  if (operation === 'get') {
598
589
  const jobId = executeFunctions.getNodeParameter('jobId', itemIndex);
599
590
  try {
600
- const response = await apiRequest(executeFunctions, 'GET', `/api/job/${jobId}`);
601
- return response;
591
+ return await apiRequest(executeFunctions, 'GET', `/api/job/${jobId}`);
602
592
  }
603
593
  catch (error) {
604
594
  throw new n8n_workflow_1.NodeApiError(executeFunctions.getNode(), {
@@ -643,8 +633,7 @@ class InNotes {
643
633
  updateFields.tags = (updateFields.tags).split(',').map((tag) => tag.trim());
644
634
  }
645
635
  try {
646
- const response = await apiRequest(executeFunctions, 'PUT', `/api/job/${jobId}`, { body: updateFields });
647
- return response;
636
+ return await apiRequest(executeFunctions, 'PUT', `/api/job/${jobId}`, { body: updateFields });
648
637
  }
649
638
  catch (error) {
650
639
  throw new n8n_workflow_1.NodeApiError(executeFunctions.getNode(), {
@@ -744,13 +733,12 @@ class InNotes {
744
733
  message: `The operation "${operation}" is not supported for resource "job"!`,
745
734
  });
746
735
  }
747
- async executeStatusOperation(executeFunctions, itemIndex, operation) {
736
+ static async executeStatusOperation(executeFunctions, itemIndex, operation) {
748
737
  if (operation === 'create') {
749
738
  const name = executeFunctions.getNodeParameter('name', itemIndex);
750
739
  const type = executeFunctions.getNodeParameter('type', itemIndex);
751
740
  const body = { name, type };
752
- const response = await apiRequest(executeFunctions, 'POST', '/api/statuses', { body });
753
- return response;
741
+ return await apiRequest(executeFunctions, 'POST', '/api/statuses', { body });
754
742
  }
755
743
  if (operation === 'getAll') {
756
744
  const type = executeFunctions.getNodeParameter('type', itemIndex, 'contact');
@@ -761,7 +749,7 @@ class InNotes {
761
749
  message: `The operation "${operation}" is not supported for resource "status"!`,
762
750
  });
763
751
  }
764
- async executeTagOperation(executeFunctions, _itemIndex, operation) {
752
+ static async executeTagOperation(executeFunctions, _itemIndex, operation) {
765
753
  if (operation === 'getAll') {
766
754
  const response = await apiRequest(executeFunctions, 'GET', '/api/tags');
767
755
  return Array.isArray(response) ? response : [response];
@@ -770,11 +758,10 @@ class InNotes {
770
758
  message: `The operation "${operation}" is not supported for resource "tag"! Supported operations: getAll`,
771
759
  });
772
760
  }
773
- async executeUserOperation(executeFunctions, _itemIndex, operation) {
761
+ static async executeUserOperation(executeFunctions, _itemIndex, operation) {
774
762
  var _a, _b, _c, _d, _e, _f, _g;
775
763
  if (operation === 'get') {
776
- const response = await apiRequest(executeFunctions, 'GET', '/api/user');
777
- return response;
764
+ return await apiRequest(executeFunctions, 'GET', '/api/user');
778
765
  }
779
766
  if (operation === 'getCv') {
780
767
  const response = await apiRequest(executeFunctions, 'GET', '/api/user');
@@ -1 +1 @@
1
- {"version":3,"sources":["../nodes/InNotes/InNotes.node.ts"],"names":[],"mappings":"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","file":"InNotes.node.js","sourcesContent":["/**\n * @author Marco\n * @date 2026-09-09\n */\n\nimport {\n\tIDataObject,\n\tIExecuteFunctions,\n\tIHttpRequestMethods,\n\tILoadOptionsFunctions,\n\tINodeExecutionData,\n\tINodePropertyOptions,\n\tINodeType,\n\tINodeTypeDescription,\n\tNodeApiError,\n} from 'n8n-workflow';\n\nimport {contactFields, contactOperations} from '../../descriptions/ContactDescription';\nimport {noteFields, noteOperations} from '../../descriptions/NoteDescription';\nimport {jobFields, jobOperations} from '../../descriptions/JobDescription';\nimport {statusFields, statusOperations} from '../../descriptions/StatusDescription';\nimport {tagFields, tagOperations} from '../../descriptions/TagDescription';\nimport {userFields, userOperations} from '../../descriptions/UserDescription';\nimport {automationFields, automationOperations} from '../../descriptions/AutomationDescription';\nimport {IContactDetail} from '../../types/InNotesTypes';\n\ntype InNotesApiContext = IExecuteFunctions | ILoadOptionsFunctions;\n\n/**\n * One authenticated call to the InNotes API.\n *\n * `Content-Type` is derived from the presence of a body and `qs` is spread only\n * when given: that is what every call site sent before this helper existed, and\n * a header or an empty `qs` added here would change all of them at once.\n *\n * HTTP only: response normalisation and every catch block stay at the call site.\n *\n * @author Marco\n * @date 2026-09-09\n */\nasync function apiRequest(\n\tctx: InNotesApiContext,\n\tmethod: IHttpRequestMethods,\n\tpath: string,\n\toptions: { qs?: IDataObject; body?: IDataObject } = {},\n): Promise<any> {\n\tconst credentials = await ctx.getCredentials('inNotesApi');\n\treturn ctx.helpers.httpRequestWithAuthentication.call(ctx, 'inNotesApi', {\n\t\tmethod,\n\t\turl: `${credentials.baseUrl as string}${path}`,\n\t\t...(options.qs ? { qs: options.qs } : {}),\n\t\t...(options.body ? { body: options.body } : {}),\n\t\theaders: {\n\t\t\tAccept: 'application/json',\n\t\t\t...(options.body ? { 'Content-Type': 'application/json' } : {}),\n\t\t},\n\t});\n}\n\n/**\n * Fail on an unusable credential BEFORE entering a catch that would absorb it.\n *\n * `apiRequest` resolves the credential per request, i.e. inside whatever try the\n * caller wrote. Two of those catches answer a failure with a successful \"does not\n * exist\" item — one always, the other under continueOnFail — so a credential\n * fault resolved in there would report that the job does not exist. Call this\n * first at those sites; do not delete it because the result is unused.\n *\n * @author Marco\n * @date 2026-09-09\n */\nasync function assertCredentials(ctx: InNotesApiContext): Promise<void> {\n\tawait ctx.getCredentials('inNotesApi');\n}\n\n/**\n * Resolve a job status NAME to its numeric id, case-insensitively.\n *\n * The caller keeps the decision about what to do with the result: job create\n * drops a falsy id from the body, job update assigns it unconditionally. That\n * divergence predates this helper and is preserved unchanged; whether it was\n * ever intended is not established — see the two call sites.\n *\n * @author Marco\n * @date 2026-09-09\n */\nasync function resolveJobStatusId(\n\texecuteFunctions: IExecuteFunctions,\n\tstatusName: string,\n): Promise<number> {\n\ttry {\n\t\tconst statusResponse = await apiRequest(executeFunctions, 'GET', '/api/statuses', {\n\t\t\tqs: { type: 'job' },\n\t\t});\n\n\t\tconst statuses = Array.isArray(statusResponse) ? statusResponse : [statusResponse];\n\t\tconst matchingStatus = statuses.find((s: any) =>\n\t\t\ts.name?.toLowerCase() === statusName.toLowerCase(),\n\t\t);\n\n\t\tif (!matchingStatus) {\n\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\tmessage: `Status \"${statusName}\" not found. Available statuses: ${statuses.map((s: any) => s.name).join(', ')}`,\n\t\t\t});\n\t\t}\n\n\t\treturn parseInt(matchingStatus.id, 10);\n\t} catch (error) {\n\t\tif (error instanceof NodeApiError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `Failed to lookup status \"${statusName}\": ${(error as Error).message}`,\n\t\t});\n\t}\n}\n\n/**\n * Turn the \"Phone & Email\" fixedCollection into the array the API takes.\n *\n * n8n hands a fixedCollection over as `{ entry: [{...}, ...] }`, and the update\n * operation posts its collection of fields straight through as the request body\n * — so without this the API would receive an object where it requires an array\n * and answer 400, for a field the user filled in correctly.\n *\n * Returns undefined when the field was never used, which leaves the stored\n * recapiti alone. Rows that were configured but are all unusable raise, on\n * update only — see `raiseWhenUnusable`.\n *\n * Undefined and NOT an empty array, deliberately. An empty array is a request to\n * DELETE every number and address the contact has, and a workflow run before its\n * upstream data arrived would quietly empty the field on a live contact and\n * answer 200. Clearing is not expressible through this node; the REST route and\n * the MCP tool both take an explicit `[]` for anyone who means it.\n * Author: Marco, August 10, 2026\n */\nexport function contactDetailsFromCollection(\n\traw: unknown,\n\traiseWhenUnusable = false,\n): IContactDetail[] | undefined {\n\tif (raw === undefined || raw === null) return undefined;\n\t// A fixedCollection can be set to an expression, and `{{ $json.contact_details }}`\n\t// carrying the API's own shape arrives as a bare array rather than {entry: [...]}.\n\t// Reading only `.entry` there returns undefined and writes nothing, under a 200.\n\tconst entries = Array.isArray(raw) ? raw : (raw as IDataObject).entry;\n\tif (!Array.isArray(entries) || entries.length === 0) return undefined;\n\n\tconst details = entries\n\t\t.map((entry) => {\n\t\t\tconst row = entry as IDataObject;\n\t\t\tconst label = typeof row.label === 'string' ? row.label.trim() : '';\n\t\t\t// Coerced, not discarded: an expression is the normal way to fill this\n\t\t\t// in, and `{{ $json.phone }}` resolving to a NUMBER is a filled-in row.\n\t\t\tconst value = row.value === undefined || row.value === null ? '' : String(row.value).trim();\n\t\t\treturn {type: row.type, value, ...(label ? {label} : {})} as IContactDetail;\n\t\t})\n\t\t// `type` is a dropdown but expression-settable, so a workflow can resolve\n\t\t// it to 'mobile'. Dropping beats defaulting to email, which would send a\n\t\t// phone number as an address and earn a 400 about the value, not the type.\n\t\t.filter((detail) => detail.value !== '' && (detail.type === 'email' || detail.type === 'phone'));\n\n\t// Rows were configured and none survived. On UPDATE that has to raise: the\n\t// field would be deleted from the body, nothing would be written, and the\n\t// node would report 200 to an operator who filled in three rows.\n\t//\n\t// On CREATE it must NOT raise. There the contact itself is the point and the\n\t// recapiti are optional, so a row whose expression resolved to \"\" for this\n\t// item would abort the whole create — importing 100 contacts would silently\n\t// skip the 30 with no phone number. Author: Marco, 2026-08-10\n\tif (details.length === 0) {\n\t\tif (raiseWhenUnusable) {\n\t\t\tthrow new Error(\n\t\t\t\t'Phone & Email: no usable entry. Each row needs a Value, and a Type of exactly \"email\" or \"phone\".',\n\t\t\t);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\treturn details;\n}\n\nexport class InNotes implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'InNotes',\n\t\tname: 'inNotes',\n\t\ticon: 'file:Logo_128.png',\n\t\tgroup: ['output'],\n\t\tversion: 1,\n\t\tsubtitle: '={{$parameter[\"operation\"] + \": \" + $parameter[\"resource\"]}}',\n\t\tdescription: 'Consume InNotes CRM API',\n\t\tdefaults: {\n\t\t\tname: 'InNotes',\n\t\t},\n\t\tinputs: ['main'],\n\t\toutputs: ['main'],\n\t\tcredentials: [\n\t\t\t{\n\t\t\t\tname: 'inNotesApi',\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t\tproperties: [\n\t\t\t{\n\t\t\t\tdisplayName: 'Resource',\n\t\t\t\tname: 'resource',\n\t\t\t\ttype: 'options',\n\t\t\t\tnoDataExpression: true,\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Automation',\n\t\t\t\t\t\tvalue: 'automation',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Contact',\n\t\t\t\t\t\tvalue: 'contact',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Note',\n\t\t\t\t\t\tvalue: 'note',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Job',\n\t\t\t\t\t\tvalue: 'job',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Status',\n\t\t\t\t\t\tvalue: 'status',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Tag',\n\t\t\t\t\t\tvalue: 'tag',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'User',\n\t\t\t\t\t\tvalue: 'user',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdefault: 'contact',\n\t\t\t},\n\t\t\t...automationOperations,\n\t\t\t...contactOperations,\n\t\t\t...noteOperations,\n\t\t\t...jobOperations,\n\t\t\t...statusOperations,\n\t\t\t...tagOperations,\n\t\t\t...userOperations,\n\t\t\t...automationFields,\n\t\t\t...contactFields,\n\t\t\t...noteFields,\n\t\t\t...jobFields,\n\t\t\t...statusFields,\n\t\t\t...tagFields,\n\t\t\t...userFields,\n\t\t\t{\n\t\t\t\tdisplayName: 'Options',\n\t\t\t\tname: 'options',\n\t\t\t\ttype: 'collection',\n\t\t\t\tplaceholder: 'Add Option',\n\t\t\t\tdefault: {},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Batch Size',\n\t\t\t\t\t\tname: 'batchSize',\n\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\tdefault: 10,\n\t\t\t\t\t\tdescription: 'Number of items to process in each batch (to avoid rate limiting)',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\tminValue: 1,\n\t\t\t\t\t\t\tmaxValue: 100,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Timeout Between Batches (ms)',\n\t\t\t\t\t\tname: 'timeoutBetweenBatches',\n\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\tdefault: 1000,\n\t\t\t\t\t\tdescription: 'Delay in milliseconds between processing batches (to avoid rate limiting)',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\tminValue: 0,\n\t\t\t\t\t\t\tmaxValue: 30000,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n\n\tmethods = {\n\t\tloadOptions: {\n\t\t\tasync jobStatuses(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await apiRequest(this, 'GET', '/api/statuses', {\n\t\t\t\t\t\tqs: { type: 'job' },\n\t\t\t\t\t});\n\n\t\t\t\t\tconst statuses = Array.isArray(response) ? response : [response];\n\t\t\t\t\treturn statuses.map((status: any) => ({\n\t\t\t\t\t\tname: status.name,\n\t\t\t\t\t\tvalue: status.name,\n\t\t\t\t\t}));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new NodeApiError(this.getNode(), {\n\t\t\t\t\t\tmessage: `Failed to load job statuses: ${(error as Error).message}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t};\n\n\tasync execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {\n\t\tconst items = this.getInputData();\n\t\tconst returnData: IDataObject[] = [];\n\t\tconst resource = this.getNodeParameter('resource', 0);\n\t\tconst operation = this.getNodeParameter('operation', 0);\n\n\t\t// Get batch options\n\t\tconst options = this.getNodeParameter('options', 0, {}) as IDataObject;\n\t\tconst batchSize = options.batchSize as number || 10;\n\t\tconst timeoutBetweenBatches = options.timeoutBetweenBatches as number || 1000;\n\n\t\t// Create a node instance to access the methods\n\t\tconst nodeInstance = new InNotes();\n\n\t\t// Helper function to add delay between batches\n\t\tconst delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\n\t\tif (resource === 'job' && operation === 'batchExists') {\n\t\t\t// Under continueOnFail the catch in the loop answers a failure with\n\t\t\t// exists:false for every id.\n\t\t\tawait assertCredentials(this);\n\t\t\tconst batchLimit = 200;\n\n\t\t\tconst idsRaw = this.getNodeParameter('ids', 0, '') as string;\n\t\t\tconst allExtIds = idsRaw.split(',').map(id => id.trim()).filter(id => id.length > 0);\n\n\t\t\tif (allExtIds.length === 0) {\n\t\t\t\treturn [this.helpers.returnJsonArray([{ error: 'No valid IDs provided' }])];\n\t\t\t}\n\n\t\t\tconst allResults: Record<string, boolean> = {};\n\n\t\t\tfor (let offset = 0; offset < allExtIds.length; offset += batchLimit) {\n\t\t\t\tconst chunk = allExtIds.slice(offset, offset + batchLimit);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await apiRequest(this, 'POST', '/api/job/batch-exists', {\n\t\t\t\t\t\tbody: { ext_ids: chunk },\n\t\t\t\t\t});\n\n\t\t\t\t\tconst results = (response as IDataObject).results as Record<string, boolean> ?? {};\n\t\t\t\t\tObject.assign(allResults, results);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\tfor (const extId of chunk) {\n\t\t\t\t\t\t\tallResults[extId] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const extId of allExtIds) {\n\t\t\t\treturnData.push({\n\t\t\t\t\text_id: extId,\n\t\t\t\t\texists: allResults[extId] ?? false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn [this.helpers.returnJsonArray(returnData)];\n\t\t}\n\n\t\t// Process items in batches\n\t\tfor (let batchStart = 0; batchStart < items.length; batchStart += batchSize) {\n\t\t\tconst batchEnd = Math.min(batchStart + batchSize, items.length);\n\t\t\tconst currentBatch = items.slice(batchStart, batchEnd);\n\n\t\t\t// Process current batch\n\t\t\tfor (let i = 0; i < currentBatch.length; i++) {\n\t\t\t\tconst actualIndex = batchStart + i;\n\t\t\t\ttry {\n\t\t\t\t\tlet responseData: IDataObject | IDataObject[] = {};\n\n\t\t\t\t\tif (resource === 'automation') {\n\t\t\t\t\t\tresponseData = await nodeInstance.executeAutomationOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'contact') {\n\t\t\t\t\t\tresponseData = await nodeInstance.executeContactOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'note') {\n\t\t\t\t\t\tresponseData = await nodeInstance.executeNoteOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'job') {\n\t\t\t\t\t\tresponseData = await nodeInstance.executeJobOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'status') {\n\t\t\t\t\t\tresponseData = await nodeInstance.executeStatusOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'tag') {\n\t\t\t\t\t\tresponseData = await nodeInstance.executeTagOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'user') {\n\t\t\t\t\t\tresponseData = await nodeInstance.executeUserOperation(this, actualIndex, operation);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Array.isArray(responseData)) {\n\t\t\t\t\t\treturnData.push(...responseData);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturnData.push(responseData);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\treturnData.push({ error: (error as Error).message });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add delay between batches (except after the last batch)\n\t\t\tif (batchEnd < items.length && timeoutBetweenBatches > 0) {\n\t\t\t\tawait delay(timeoutBetweenBatches);\n\t\t\t}\n\t\t}\n\n\t\treturn [this.helpers.returnJsonArray(returnData)];\n\t}\n\n\tprivate async executeAutomationOperation(executeFunctions: IExecuteFunctions, itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'getConfig') {\n\t\t\ttry {\n\t\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/automation/config');\n\n\t\t\t\treturn response;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to get automation config: ${(error as Error).message}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'reportJobCreated') {\n\t\t\tconst jobsAdded = executeFunctions.getNodeParameter('jobsAdded', itemIndex, 1) as number;\n\t\t\tconst status = executeFunctions.getNodeParameter('status', itemIndex, 'success') as string;\n\t\t\tconst errorMessage = executeFunctions.getNodeParameter('errorMessage', itemIndex, '') as string;\n\n\t\t\t// Get the callback secret from credentials\n\t\t\tconst credentials = await executeFunctions.getCredentials('inNotesApi');\n\t\t\tconst callbackSecret = credentials.callbackSecret as string;\n\t\t\tif (!callbackSecret) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: 'Callback secret not configured in InNotes API credentials. Please add the callback secret to your credentials.',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Get user ID from the API\n\t\t\tlet userId: string;\n\t\t\ttry {\n\t\t\t\tconst userResponse = await apiRequest(executeFunctions, 'GET', '/api/user');\n\t\t\t\tuserId = userResponse.id;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to get user ID: ${(error as Error).message}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst body: IDataObject = {\n\t\t\t\tuserId,\n\t\t\t\tstatus,\n\t\t\t\tjobsAdded,\n\t\t\t\tsecret: callbackSecret,\n\t\t\t\t...(status === 'error' && errorMessage && { error: errorMessage }),\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst response = await apiRequest(executeFunctions, 'POST', '/api/automation/callback', { body });\n\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\t...response,\n\t\t\t\t\tjobsAdded,\n\t\t\t\t\tstatus,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to report job created: ${(error as Error).message}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"automation\"!`,\n\t\t});\n\t}\n\n\tprivate async executeContactOperation(executeFunctions: IExecuteFunctions, itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'create') {\n\t\t\tconst name = executeFunctions.getNodeParameter('name', itemIndex) as string;\n\t\t\tconst linkedin_key = executeFunctions.getNodeParameter('linkedin_key', itemIndex) as string;\n\t\t\tconst linkedin_user = executeFunctions.getNodeParameter('linkedin_user', itemIndex, '') as string;\n\t\t\tconst location = executeFunctions.getNodeParameter('location', itemIndex, '') as string;\n\t\t\tconst current_company = executeFunctions.getNodeParameter('current_company', itemIndex, '') as string;\n\t\t\tconst picture_url = executeFunctions.getNodeParameter('picture_url', itemIndex, '') as string;\n\t\t\tconst tags = executeFunctions.getNodeParameter('tags', itemIndex, '') as string;\n\t\t\tconst status_id = executeFunctions.getNodeParameter('status_id', itemIndex, '') as string;\n\t\t\tconst contact_details = contactDetailsFromCollection(\n\t\t\t\texecuteFunctions.getNodeParameter('contact_details', itemIndex, {}),\n\t\t\t);\n\n\t\t\tconst body: IDataObject = {\n\t\t\t\tname,\n\t\t\t\tlinkedin_key,\n\t\t\t\t...(linkedin_user && { linkedin_user }),\n\t\t\t\t...(location && { location }),\n\t\t\t\t...(current_company && { current_company }),\n\t\t\t\t...(picture_url && { picture_url }),\n\t\t\t\t...(tags && { tags: tags.split(',').map((tag: string) => tag.trim()) }),\n\t\t\t\t...(status_id && { status_id }),\n\t\t\t\t...(contact_details && { contact_details }),\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst response = await apiRequest(executeFunctions, 'POST', '/api/contacts', { body });\n\n\t\t\t\treturn response;\n\t\t\t} catch (error) {\n\t\t\t\t// The COUNT, never the values: this object is interpolated into a\n\t\t\t\t// NodeApiError message and n8n persists execution data, so the\n\t\t\t\t// numbers and addresses would sit in a third party's workflow\n\t\t\t\t// history. Author: Marco, 2026-08-10\n\t\t\t\tconst requestParams = contact_details\n\t\t\t\t\t? { ...body, contact_details: `${contact_details.length} entr(y|ies)` }\n\t\t\t\t\t: body;\n\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to create contact: ${(error as Error).message}. Request parameters: ${JSON.stringify(requestParams, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'get') {\n\t\t\tconst contactId = executeFunctions.getNodeParameter('contactId', itemIndex) as string;\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', `/api/contacts/${contactId}`);\n\n\t\t\treturn response;\n\t\t}\n\n\t\tif (operation === 'getAll') {\n\t\t\tconst returnAll = executeFunctions.getNodeParameter('returnAll', itemIndex, false) as boolean;\n\t\t\tconst search = executeFunctions.getNodeParameter('search', itemIndex, '') as string;\n\t\t\tconst tags = executeFunctions.getNodeParameter('tags', itemIndex, '') as string;\n\n\t\t\tconst qs: IDataObject = {};\n\t\t\tif (search) qs.search = search;\n\t\t\tif (tags) qs.tags = tags;\n\n\t\t\tif (!returnAll) {\n\t\t\t\tconst limit = executeFunctions.getNodeParameter('limit', itemIndex, 24);\n\t\t\t\tqs.pageSize = limit;\n\t\t\t\tqs.page = 1;\n\t\t\t}\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/contacts', { qs });\n\n\t\t\treturn Array.isArray(response) ? response : [response];\n\t\t}\n\n\t\tif (operation === 'update') {\n\t\t\tconst contactId = executeFunctions.getNodeParameter('contactId', itemIndex) as string;\n\t\t\tconst updateFields = executeFunctions.getNodeParameter('updateFields', itemIndex) as IDataObject;\n\n\t\t\t// The collection goes through as the request body verbatim, so the one\n\t\t\t// field whose n8n shape differs from the API's is rewritten here rather\n\t\t\t// than shipped as an object the route refuses.\n\t\t\t// Raises when rows were configured and none are usable: on update the\n\t\t\t// alternative is dropping the field and reporting success.\n\t\t\tconst contact_details = contactDetailsFromCollection(updateFields.contact_details, true);\n\t\t\tconst body: IDataObject = {\n\t\t\t\t...updateFields,\n\t\t\t\t...(contact_details ? {contact_details} : {}),\n\t\t\t};\n\t\t\tif (contact_details === undefined) delete body.contact_details;\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'PUT', `/api/contacts/${contactId}`, { body });\n\n\t\t\treturn response;\n\t\t}\n\n\t\tif (operation === 'delete') {\n\t\t\tconst contactId = executeFunctions.getNodeParameter('contactId', itemIndex) as string;\n\n\t\t\tawait apiRequest(executeFunctions, 'DELETE', `/api/contacts/${contactId}`);\n\n\t\t\treturn { success: true };\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"contact\"!`,\n\t\t});\n\t}\n\n\tprivate async executeNoteOperation(executeFunctions: IExecuteFunctions, itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'create') {\n\t\t\tconst content = executeFunctions.getNodeParameter('content', itemIndex) as string;\n\t\t\tconst contactId = executeFunctions.getNodeParameter('contactId', itemIndex) as string | number;\n\t\t\tconst visibility = executeFunctions.getNodeParameter('visibility', itemIndex, '') as string;\n\t\t\tconst ext_table_name = executeFunctions.getNodeParameter('ext_table_name', itemIndex, '') as string;\n\n\t\t\tconst body: IDataObject = {\n\t\t\t\tcontent,\n\t\t\t\tcontact_id: contactId,\n\t\t\t\t...(visibility && { visibility }),\n\t\t\t\t...(ext_table_name && { ext_table_name }),\n\t\t\t};\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'POST', '/api/note', { body });\n\n\t\t\treturn response;\n\t\t}\n\n\t\tif (operation === 'get') {\n\t\t\tconst noteId = executeFunctions.getNodeParameter('noteId', itemIndex) as string | number;\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', `/api/note/${noteId}`);\n\n\t\t\treturn response;\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"note\"!`,\n\t\t});\n\t}\n\n\tprivate async executeJobOperation(executeFunctions: IExecuteFunctions, itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'create') {\n\t\t\tconst name = executeFunctions.getNodeParameter('name', itemIndex) as string;\n\t\t\tconst company_name = executeFunctions.getNodeParameter('company_name', itemIndex) as string;\n\t\t\tconst status = executeFunctions.getNodeParameter('status', itemIndex, '') as string;\n\t\t\tconst description = executeFunctions.getNodeParameter('description', itemIndex, '') as string;\n\t\t\tconst location = executeFunctions.getNodeParameter('location', itemIndex, '') as string;\n\t\t\tconst remote_setting = executeFunctions.getNodeParameter('remote_setting', itemIndex, '') as string;\n\t\t\tconst company_url = executeFunctions.getNodeParameter('company_url', itemIndex, '') as string;\n\t\t\tconst provider = executeFunctions.getNodeParameter('provider', itemIndex, 'external') as string;\n\t\t\tconst url = executeFunctions.getNodeParameter('url', itemIndex, '') as string;\n\t\t\tconst ext_id = executeFunctions.getNodeParameter('ext_id', itemIndex, '') as string;\n\t\t\tconst picture_url = executeFunctions.getNodeParameter('picture_url', itemIndex, '') as string;\n\t\t\tconst tags = executeFunctions.getNodeParameter('tags', itemIndex, '') as string;\n\n\t\t\tlet status_id: number | undefined;\n\n\t\t\t// If status is provided, lookup the status ID\n\t\t\tif (status) {\n\t\t\t\tstatus_id = await resolveJobStatusId(executeFunctions, status);\n\t\t\t}\n\n\t\t\tconst body: IDataObject = {\n\t\t\t\tname,\n\t\t\t\tcompany_name,\n\t\t\t\t...(description && { description }),\n\t\t\t\t...(location && { location }),\n\t\t\t\t...(remote_setting && { remote_setting }),\n\t\t\t\t...(company_url && { company_url }),\n\t\t\t\t...(provider && { provider }),\n\t\t\t\t...(url && { url }),\n\t\t\t\t...(status_id && { status_id }),\n\t\t\t\t...(ext_id && { ext_id }),\n\t\t\t\t...(picture_url && picture_url !== 'Not Available' && { picture_url }),\n\t\t\t\t...(tags && { tags: tags.split(',').map((tag: string) => tag.trim()) }),\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst response = await apiRequest(executeFunctions, 'POST', '/api/job', { body });\n\n\t\t\t\treturn response;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to create job: ${(error as Error).message}. Request parameters: ${JSON.stringify(body, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'get') {\n\t\t\tconst jobId = executeFunctions.getNodeParameter('jobId', itemIndex) as string | number;\n\n\t\t\ttry {\n\t\t\t\tconst response = await apiRequest(executeFunctions, 'GET', `/api/job/${jobId}`);\n\n\t\t\t\treturn response;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to get job: ${(error as Error).message}. Request parameters: ${JSON.stringify({ jobId }, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'getAll') {\n\t\t\tconst returnAll = executeFunctions.getNodeParameter('returnAll', itemIndex, false) as boolean;\n\t\t\tconst search = executeFunctions.getNodeParameter('search', itemIndex, '') as string;\n\t\t\tconst tags = executeFunctions.getNodeParameter('tags', itemIndex, '') as string;\n\n\t\t\tconst qs: IDataObject = {};\n\t\t\tif (search) qs.search = search;\n\t\t\tif (tags) qs.tags = tags;\n\n\t\t\tif (!returnAll) {\n\t\t\t\tconst limit = executeFunctions.getNodeParameter('limit', itemIndex, 24);\n\t\t\t\tqs.pageSize = limit;\n\t\t\t\tqs.page = 1;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/job', { qs });\n\n\t\t\t\treturn Array.isArray(response) ? response : [response];\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to get all jobs: ${(error as Error).message}. Request parameters: ${JSON.stringify({ returnAll, search, tags, queryParams: qs }, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'update') {\n\t\t\tconst jobId = executeFunctions.getNodeParameter('jobId', itemIndex) as string | number;\n\t\t\tconst updateFields = executeFunctions.getNodeParameter('updateFields', itemIndex);\n\n\t\t\t// Handle status string lookup if provided\n\t\t\tif (updateFields.status && typeof updateFields.status === 'string') {\n\t\t\t\tupdateFields.status_id = await resolveJobStatusId(executeFunctions, updateFields.status);\n\t\t\t\tdelete updateFields.status;\n\t\t\t}\n\n\t\t\t// Process tags if provided as comma-separated string\n\t\t\tif (updateFields.tags && typeof updateFields.tags === 'string') {\n\t\t\t\tupdateFields.tags = (updateFields.tags).split(',').map((tag: string) => tag.trim());\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst response = await apiRequest(executeFunctions, 'PUT', `/api/job/${jobId}`, { body: updateFields });\n\n\t\t\t\treturn response;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to update job: ${(error as Error).message}. Request parameters: ${JSON.stringify({ jobId, updateFields }, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'delete') {\n\t\t\tconst jobId = executeFunctions.getNodeParameter('jobId', itemIndex) as string | number;\n\n\t\t\ttry {\n\t\t\t\tawait apiRequest(executeFunctions, 'DELETE', `/api/job/${jobId}`);\n\n\t\t\t\treturn { success: true };\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to delete job: ${(error as Error).message}. Request parameters: ${JSON.stringify({ jobId }, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'search') {\n\t\t\tconst searchMethod = executeFunctions.getNodeParameter('searchMethod', itemIndex) as string;\n\t\t\tconst searchQuery = executeFunctions.getNodeParameter('searchQuery', itemIndex) as string;\n\t\t\tconst searchOptions = executeFunctions.getNodeParameter('searchOptions', itemIndex, {}) as IDataObject;\n\n\t\t\tconst qs: IDataObject = {};\n\n\t\t\t// Handle different search methods\n\t\t\tswitch (searchMethod) {\n\t\t\tcase 'general':\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t\tbreak;\n\t\t\tcase 'ext_id':\n\t\t\t\tqs.ext_id = searchQuery;\n\t\t\t\tbreak;\n\t\t\tcase 'title':\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t\tqs.searchField = 'title';\n\t\t\t\tbreak;\n\t\t\tcase 'company':\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t\tqs.searchField = 'company';\n\t\t\t\tbreak;\n\t\t\tcase 'location':\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t\tqs.searchField = 'location';\n\t\t\t\tbreak;\n\t\t\tcase 'description':\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t\tqs.searchField = 'description';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t}\n\n\t\t\t// Add additional filter parameters\n\t\t\tif (searchOptions.remote_setting) qs.remote_setting = searchOptions.remote_setting;\n\t\t\tif (searchOptions.status) qs.status = searchOptions.status;\n\t\t\tif (searchOptions.tags) qs.tags = searchOptions.tags;\n\n\t\t\t// Set limit with default value\n\t\t\tconst limit = (searchOptions.limit as number) || 24;\n\t\t\tqs.pageSize = limit;\n\t\t\tqs.page = 1;\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/job', { qs });\n\n\t\t\treturn Array.isArray(response) ? response : [response];\n\t\t}\n\n\t\tif (operation === 'exists') {\n\t\t\tconst id = executeFunctions.getNodeParameter('id', itemIndex) as string;\n\n\t\t\t// Both catches below treat any failure as \"not found\".\n\t\t\tawait assertCredentials(executeFunctions);\n\n\t\t\ttry {\n\t\t\t\t// First try to get by job ID\n\t\t\t\ttry {\n\t\t\t\t\tawait apiRequest(executeFunctions, 'GET', `/api/job/${id}`);\n\t\t\t\t\t// If we get here, the job exists by ID\n\t\t\t\t\treturn { exists: true, found_by: 'job_id', id };\n\t\t\t\t} catch {\n\t\t\t\t\t// Job not found by ID, try searching by ext_id\n\t\t\t\t\tconst searchResponse = await apiRequest(executeFunctions, 'GET', '/api/job', {\n\t\t\t\t\t\tqs: { ext_id: id },\n\t\t\t\t\t});\n\n\t\t\t\t\t// Check if any results were returned\n\t\t\t\t\tconst results = Array.isArray(searchResponse) ? searchResponse : [searchResponse];\n\t\t\t\t\tif (results.length > 0 && results[0]) {\n\t\t\t\t\t\treturn { exists: true, found_by: 'ext_id', id };\n\t\t\t\t\t}\n\n\t\t\t\t\t// Not found by either ID or ext_id\n\t\t\t\t\treturn { exists: false, id };\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// If there's an error during the search, return false\n\t\t\t\treturn { exists: false, id, error: (error as Error).message };\n\t\t\t}\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"job\"!`,\n\t\t});\n\t}\n\n\tprivate async executeStatusOperation(executeFunctions: IExecuteFunctions, itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'create') {\n\t\t\tconst name = executeFunctions.getNodeParameter('name', itemIndex) as string;\n\t\t\tconst type = executeFunctions.getNodeParameter('type', itemIndex) as string;\n\n\t\t\tconst body: IDataObject = { name, type };\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'POST', '/api/statuses', { body });\n\n\t\t\treturn response;\n\t\t}\n\n\t\tif (operation === 'getAll') {\n\t\t\tconst type = executeFunctions.getNodeParameter('type', itemIndex, 'contact') as string;\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/statuses', { qs: { type } });\n\n\t\t\treturn Array.isArray(response) ? response : [response];\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"status\"!`,\n\t\t});\n\t}\n\n\tprivate async executeTagOperation(executeFunctions: IExecuteFunctions, _itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'getAll') {\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/tags');\n\n\t\t\treturn Array.isArray(response) ? response : [response];\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"tag\"! Supported operations: getAll`,\n\t\t});\n\t}\n\n\tprivate async executeUserOperation(executeFunctions: IExecuteFunctions, _itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'get') {\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/user');\n\n\t\t\treturn response;\n\t\t}\n\n\t\tif (operation === 'getCv') {\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/user');\n\n\t\t\t// Return only CV-related fields\n\t\t\tconst { cv, job_preferences, cv_updated_at } = response;\n\n\t\t\t// Parse job_preferences if it's a JSON string\n\t\t\tlet parsedPreferences = null;\n\t\t\tlet searchJobTitles = [];\n\t\t\tlet locations = [];\n\t\t\tlet titleBlacklist = [];\n\t\t\tlet companyBlacklist = [];\n\t\t\tlet penalize = [];\n\n\t\t\tif (job_preferences) {\n\t\t\t\ttry {\n\t\t\t\t\tparsedPreferences = typeof job_preferences === 'string'\n\t\t\t\t\t\t? JSON.parse(job_preferences)\n\t\t\t\t\t\t: job_preferences;\n\n\t\t\t\t\tsearchJobTitles = parsedPreferences.searchJobTitles ?? [];\n\t\t\t\t\tlocations = parsedPreferences.locations ?? [];\n\n\t\t\t\t\t// Handle both new blacklist structure and legacy structure\n\t\t\t\t\tif (parsedPreferences.blacklist) {\n\t\t\t\t\t\ttitleBlacklist = parsedPreferences.blacklist.titleBlacklist ?? [];\n\t\t\t\t\t\tcompanyBlacklist = parsedPreferences.blacklist.companyBlacklist ?? [];\n\t\t\t\t\t\tpenalize = parsedPreferences.blacklist.penalize ?? [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Legacy support\n\t\t\t\t\t\ttitleBlacklist = parsedPreferences.titleBlacklist ?? [];\n\t\t\t\t\t\tcompanyBlacklist = parsedPreferences.companyBlacklist ?? [];\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// If parsing fails, keep empty arrays\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcv,\n\t\t\t\tjob_preferences: parsedPreferences,\n\t\t\t\tcv_updated_at,\n\t\t\t\tsearchJobTitles: searchJobTitles.join(', '),\n\t\t\t\tlocations: locations.join(', '),\n\t\t\t\ttitleBlacklist: titleBlacklist.join(', '),\n\t\t\t\tcompanyBlacklist: companyBlacklist.join(', '),\n\t\t\t\tpenalize: penalize.join(', '),\n\t\t\t};\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"user\"! Supported operations: get, getCv`,\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../nodes/InNotes/InNotes.node.ts"],"names":[],"mappings":"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","file":"InNotes.node.js","sourcesContent":["/**\n * @author Marco\n * @date 2026-09-14\n */\n\nimport {\n\tIDataObject,\n\tIExecuteFunctions,\n\tIHttpRequestMethods,\n\tILoadOptionsFunctions,\n\tINodeExecutionData,\n\tINodePropertyOptions,\n\tINodeType,\n\tINodeTypeDescription,\n\tNodeApiError,\n} from 'n8n-workflow';\n\nimport {contactFields, contactOperations} from '../../descriptions/ContactDescription';\nimport {noteFields, noteOperations} from '../../descriptions/NoteDescription';\nimport {jobFields, jobOperations} from '../../descriptions/JobDescription';\nimport {statusFields, statusOperations} from '../../descriptions/StatusDescription';\nimport {tagFields, tagOperations} from '../../descriptions/TagDescription';\nimport {userFields, userOperations} from '../../descriptions/UserDescription';\nimport {automationFields, automationOperations} from '../../descriptions/AutomationDescription';\nimport {IContactDetail} from '../../types/InNotesTypes';\n\ntype InNotesApiContext = IExecuteFunctions | ILoadOptionsFunctions;\n\n/**\n * One authenticated call to the InNotes API.\n *\n * `Content-Type` is derived from the presence of a body and `qs` is spread only\n * when given: that is what every call site sent before this helper existed, and\n * a header or an empty `qs` added here would change all of them at once.\n *\n * HTTP only: response normalisation and every catch block stay at the call site.\n *\n * @author Marco\n * @date 2026-09-09\n */\nasync function apiRequest(\n\tctx: InNotesApiContext,\n\tmethod: IHttpRequestMethods,\n\tpath: string,\n\toptions: { qs?: IDataObject; body?: IDataObject } = {},\n): Promise<any> {\n\tconst credentials = await ctx.getCredentials('inNotesApi');\n\treturn ctx.helpers.httpRequestWithAuthentication.call(ctx, 'inNotesApi', {\n\t\tmethod,\n\t\turl: `${credentials.baseUrl as string}${path}`,\n\t\t...(options.qs ? { qs: options.qs } : {}),\n\t\t...(options.body ? { body: options.body } : {}),\n\t\theaders: {\n\t\t\tAccept: 'application/json',\n\t\t\t...(options.body ? { 'Content-Type': 'application/json' } : {}),\n\t\t},\n\t});\n}\n\n/**\n * Fail on an unusable credential BEFORE entering a catch that would absorb it.\n *\n * `apiRequest` resolves the credential per request, i.e. inside whatever try the\n * caller wrote. Two of those catches answer a failure with a successful \"does not\n * exist\" item — one always, the other under continueOnFail — so a credential\n * fault resolved in there would report that the job does not exist. Call this\n * first at those sites; do not delete it because the result is unused.\n *\n * @author Marco\n * @date 2026-09-09\n */\nasync function assertCredentials(ctx: InNotesApiContext): Promise<void> {\n\tawait ctx.getCredentials('inNotesApi');\n}\n\n/**\n * Resolve a job status NAME to its numeric id, case-insensitively.\n *\n * The caller keeps the decision about what to do with the result: job create\n * drops a falsy id from the body, job update assigns it unconditionally. That\n * divergence predates this helper and is preserved unchanged; whether it was\n * ever intended is not established — see the two call sites.\n *\n * @author Marco\n * @date 2026-09-09\n */\nasync function resolveJobStatusId(\n\texecuteFunctions: IExecuteFunctions,\n\tstatusName: string,\n): Promise<number> {\n\ttry {\n\t\tconst statusResponse = await apiRequest(executeFunctions, 'GET', '/api/statuses', {\n\t\t\tqs: { type: 'job' },\n\t\t});\n\n\t\tconst statuses = Array.isArray(statusResponse) ? statusResponse : [statusResponse];\n\t\tconst matchingStatus = statuses.find((s: any) =>\n\t\t\ts.name?.toLowerCase() === statusName.toLowerCase(),\n\t\t);\n\n\t\tif (!matchingStatus) {\n\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\tmessage: `Status \"${statusName}\" not found. Available statuses: ${statuses.map((s: any) => s.name).join(', ')}`,\n\t\t\t});\n\t\t}\n\n\t\treturn parseInt(matchingStatus.id, 10);\n\t} catch (error) {\n\t\tif (error instanceof NodeApiError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `Failed to lookup status \"${statusName}\": ${(error as Error).message}`,\n\t\t});\n\t}\n}\n\n/**\n * Turn the \"Phone & Email\" fixedCollection into the array the API takes.\n *\n * n8n hands a fixedCollection over as `{ entry: [{...}, ...] }`, and the update\n * operation posts its collection of fields straight through as the request body\n * — so without this the API would receive an object where it requires an array\n * and answer 400, for a field the user filled in correctly.\n *\n * Returns undefined when the field was never used, which leaves the stored\n * recapiti alone. Rows that were configured but are all unusable raise, on\n * update only — see `raiseWhenUnusable`.\n *\n * Undefined and NOT an empty array, deliberately. An empty array is a request to\n * DELETE every number and address the contact has, and a workflow run before its\n * upstream data arrived would quietly empty the field on a live contact and\n * answer 200. Clearing is not expressible through this node; the REST route and\n * the MCP tool both take an explicit `[]` for anyone who means it.\n * Author: Marco, August 10, 2026\n */\nexport function contactDetailsFromCollection(\n\traw: unknown,\n\traiseWhenUnusable = false,\n): IContactDetail[] | undefined {\n\tif (raw === undefined || raw === null) return undefined;\n\t// A fixedCollection can be set to an expression, and `{{ $json.contact_details }}`\n\t// carrying the API's own shape arrives as a bare array rather than {entry: [...]}.\n\t// Reading only `.entry` there returns undefined and writes nothing, under a 200.\n\tconst entries = Array.isArray(raw) ? raw : (raw as IDataObject).entry;\n\tif (!Array.isArray(entries) || entries.length === 0) return undefined;\n\n\tconst details = entries\n\t\t.map((entry) => {\n\t\t\tconst row = entry as IDataObject;\n\t\t\tconst label = typeof row.label === 'string' ? row.label.trim() : '';\n\t\t\t// Coerced, not discarded: an expression is the normal way to fill this\n\t\t\t// in, and `{{ $json.phone }}` resolving to a NUMBER is a filled-in row.\n\t\t\tconst value = row.value === undefined || row.value === null ? '' : String(row.value).trim();\n\t\t\treturn {type: row.type, value, ...(label ? {label} : {})} as IContactDetail;\n\t\t})\n\t\t// `type` is a dropdown but expression-settable, so a workflow can resolve\n\t\t// it to 'mobile'. Dropping beats defaulting to email, which would send a\n\t\t// phone number as an address and earn a 400 about the value, not the type.\n\t\t.filter((detail) => detail.value !== '' && (detail.type === 'email' || detail.type === 'phone'));\n\n\t// Rows were configured and none survived. On UPDATE that has to raise: the\n\t// field would be deleted from the body, nothing would be written, and the\n\t// node would report 200 to an operator who filled in three rows.\n\t//\n\t// On CREATE it must NOT raise. There the contact itself is the point and the\n\t// recapiti are optional, so a row whose expression resolved to \"\" for this\n\t// item would abort the whole create — importing 100 contacts would silently\n\t// skip the 30 with no phone number. Author: Marco, 2026-08-10\n\tif (details.length === 0) {\n\t\tif (raiseWhenUnusable) {\n\t\t\tthrow new Error(\n\t\t\t\t'Phone & Email: no usable entry. Each row needs a Value, and a Type of exactly \"email\" or \"phone\".',\n\t\t\t);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\treturn details;\n}\n\nexport class InNotes implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'InNotes',\n\t\tname: 'inNotes',\n\t\ticon: 'file:Logo_128.png',\n\t\tgroup: ['output'],\n\t\tversion: 1,\n\t\tsubtitle: '={{$parameter[\"operation\"] + \": \" + $parameter[\"resource\"]}}',\n\t\tdescription: 'Consume InNotes CRM API',\n\t\tdefaults: {\n\t\t\tname: 'InNotes',\n\t\t},\n\t\tinputs: ['main'],\n\t\toutputs: ['main'],\n\t\tcredentials: [\n\t\t\t{\n\t\t\t\tname: 'inNotesApi',\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t\tproperties: [\n\t\t\t{\n\t\t\t\tdisplayName: 'Resource',\n\t\t\t\tname: 'resource',\n\t\t\t\ttype: 'options',\n\t\t\t\tnoDataExpression: true,\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Automation',\n\t\t\t\t\t\tvalue: 'automation',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Contact',\n\t\t\t\t\t\tvalue: 'contact',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Note',\n\t\t\t\t\t\tvalue: 'note',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Job',\n\t\t\t\t\t\tvalue: 'job',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Status',\n\t\t\t\t\t\tvalue: 'status',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Tag',\n\t\t\t\t\t\tvalue: 'tag',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'User',\n\t\t\t\t\t\tvalue: 'user',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdefault: 'contact',\n\t\t\t},\n\t\t\t...automationOperations,\n\t\t\t...contactOperations,\n\t\t\t...noteOperations,\n\t\t\t...jobOperations,\n\t\t\t...statusOperations,\n\t\t\t...tagOperations,\n\t\t\t...userOperations,\n\t\t\t...automationFields,\n\t\t\t...contactFields,\n\t\t\t...noteFields,\n\t\t\t...jobFields,\n\t\t\t...statusFields,\n\t\t\t...tagFields,\n\t\t\t...userFields,\n\t\t\t{\n\t\t\t\tdisplayName: 'Options',\n\t\t\t\tname: 'options',\n\t\t\t\ttype: 'collection',\n\t\t\t\tplaceholder: 'Add Option',\n\t\t\t\tdefault: {},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Batch Size',\n\t\t\t\t\t\tname: 'batchSize',\n\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\tdefault: 10,\n\t\t\t\t\t\tdescription: 'Number of items to process in each batch (to avoid rate limiting)',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\tminValue: 1,\n\t\t\t\t\t\t\tmaxValue: 100,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Timeout Between Batches (ms)',\n\t\t\t\t\t\tname: 'timeoutBetweenBatches',\n\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\tdefault: 1000,\n\t\t\t\t\t\tdescription: 'Delay in milliseconds between processing batches (to avoid rate limiting)',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\tminValue: 0,\n\t\t\t\t\t\t\tmaxValue: 30000,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n\n\tmethods = {\n\t\tloadOptions: {\n\t\t\tasync jobStatuses(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await apiRequest(this, 'GET', '/api/statuses', {\n\t\t\t\t\t\tqs: { type: 'job' },\n\t\t\t\t\t});\n\n\t\t\t\t\tconst statuses = Array.isArray(response) ? response : [response];\n\t\t\t\t\treturn statuses.map((status: any) => ({\n\t\t\t\t\t\tname: status.name,\n\t\t\t\t\t\tvalue: status.name,\n\t\t\t\t\t}));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new NodeApiError(this.getNode(), {\n\t\t\t\t\t\tmessage: `Failed to load job statuses: ${(error as Error).message}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t};\n\n\tasync execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {\n\t\tconst items = this.getInputData();\n\t\tconst returnData: IDataObject[] = [];\n\t\tconst resource = this.getNodeParameter('resource', 0);\n\t\tconst operation = this.getNodeParameter('operation', 0);\n\n\t\t// Get batch options\n\t\tconst options = this.getNodeParameter('options', 0, {}) as IDataObject;\n\t\tconst batchSize = options.batchSize as number || 10;\n\t\tconst timeoutBetweenBatches = options.timeoutBetweenBatches as number || 1000;\n\n\t\t// Helper function to add delay between batches\n\t\tconst delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\n\t\tif (resource === 'job' && operation === 'batchExists') {\n\t\t\t// Under continueOnFail the catch in the loop answers a failure with\n\t\t\t// exists:false for every id.\n\t\t\tawait assertCredentials(this);\n\t\t\tconst batchLimit = 200;\n\n\t\t\tconst idsRaw = this.getNodeParameter('ids', 0, '') as string;\n\t\t\tconst allExtIds = idsRaw.split(',').map(id => id.trim()).filter(id => id.length > 0);\n\n\t\t\tif (allExtIds.length === 0) {\n\t\t\t\treturn [this.helpers.returnJsonArray([{ error: 'No valid IDs provided' }])];\n\t\t\t}\n\n\t\t\tconst allResults: Record<string, boolean> = {};\n\n\t\t\tfor (let offset = 0; offset < allExtIds.length; offset += batchLimit) {\n\t\t\t\tconst chunk = allExtIds.slice(offset, offset + batchLimit);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await apiRequest(this, 'POST', '/api/job/batch-exists', {\n\t\t\t\t\t\tbody: { ext_ids: chunk },\n\t\t\t\t\t});\n\n\t\t\t\t\tconst results = (response as IDataObject).results as Record<string, boolean> ?? {};\n\t\t\t\t\tObject.assign(allResults, results);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\tfor (const extId of chunk) {\n\t\t\t\t\t\t\tallResults[extId] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const extId of allExtIds) {\n\t\t\t\treturnData.push({\n\t\t\t\t\text_id: extId,\n\t\t\t\t\texists: allResults[extId] ?? false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn [this.helpers.returnJsonArray(returnData)];\n\t\t}\n\n\t\t// Process items in batches\n\t\tfor (let batchStart = 0; batchStart < items.length; batchStart += batchSize) {\n\t\t\tconst batchEnd = Math.min(batchStart + batchSize, items.length);\n\t\t\tconst currentBatch = items.slice(batchStart, batchEnd);\n\n\t\t\t// Process current batch\n\t\t\tfor (let i = 0; i < currentBatch.length; i++) {\n\t\t\t\tconst actualIndex = batchStart + i;\n\t\t\t\ttry {\n\t\t\t\t\tlet responseData: IDataObject | IDataObject[] = {};\n\n\t\t\t\t\tif (resource === 'automation') {\n\t\t\t\t\t\tresponseData = await InNotes.executeAutomationOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'contact') {\n\t\t\t\t\t\tresponseData = await InNotes.executeContactOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'note') {\n\t\t\t\t\t\tresponseData = await InNotes.executeNoteOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'job') {\n\t\t\t\t\t\tresponseData = await InNotes.executeJobOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'status') {\n\t\t\t\t\t\tresponseData = await InNotes.executeStatusOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'tag') {\n\t\t\t\t\t\tresponseData = await InNotes.executeTagOperation(this, actualIndex, operation);\n\t\t\t\t\t} else if (resource === 'user') {\n\t\t\t\t\t\tresponseData = await InNotes.executeUserOperation(this, actualIndex, operation);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Array.isArray(responseData)) {\n\t\t\t\t\t\treturnData.push(...responseData);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturnData.push(responseData);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\treturnData.push({ error: (error as Error).message });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add delay between batches (except after the last batch)\n\t\t\tif (batchEnd < items.length && timeoutBetweenBatches > 0) {\n\t\t\t\tawait delay(timeoutBetweenBatches);\n\t\t\t}\n\t\t}\n\n\t\treturn [this.helpers.returnJsonArray(returnData)];\n\t}\n\n\tprivate static async executeAutomationOperation(executeFunctions: IExecuteFunctions, itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'getConfig') {\n\t\t\ttry {\n\t\t\t\treturn await apiRequest(executeFunctions, 'GET', '/api/automation/config');\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to get automation config: ${(error as Error).message}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'reportJobCreated') {\n\t\t\tconst jobsAdded = executeFunctions.getNodeParameter('jobsAdded', itemIndex, 1) as number;\n\t\t\tconst status = executeFunctions.getNodeParameter('status', itemIndex, 'success') as string;\n\t\t\tconst errorMessage = executeFunctions.getNodeParameter('errorMessage', itemIndex, '') as string;\n\n\t\t\t// Get the callback secret from credentials\n\t\t\tconst credentials = await executeFunctions.getCredentials('inNotesApi');\n\t\t\tconst callbackSecret = credentials.callbackSecret as string;\n\t\t\tif (!callbackSecret) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: 'Callback secret not configured in InNotes API credentials. Please add the callback secret to your credentials.',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Get user ID from the API\n\t\t\tlet userId: string;\n\t\t\ttry {\n\t\t\t\tconst userResponse = await apiRequest(executeFunctions, 'GET', '/api/user');\n\t\t\t\tuserId = userResponse.id;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to get user ID: ${(error as Error).message}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst body: IDataObject = {\n\t\t\t\tuserId,\n\t\t\t\tstatus,\n\t\t\t\tjobsAdded,\n\t\t\t\tsecret: callbackSecret,\n\t\t\t\t...(status === 'error' && errorMessage && { error: errorMessage }),\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst response = await apiRequest(executeFunctions, 'POST', '/api/automation/callback', { body });\n\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\t...response,\n\t\t\t\t\tjobsAdded,\n\t\t\t\t\tstatus,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to report job created: ${(error as Error).message}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"automation\"!`,\n\t\t});\n\t}\n\n\tprivate static async executeContactOperation(executeFunctions: IExecuteFunctions, itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'create') {\n\t\t\tconst name = executeFunctions.getNodeParameter('name', itemIndex) as string;\n\t\t\tconst linkedin_key = executeFunctions.getNodeParameter('linkedin_key', itemIndex) as string;\n\t\t\tconst linkedin_user = executeFunctions.getNodeParameter('linkedin_user', itemIndex, '') as string;\n\t\t\tconst location = executeFunctions.getNodeParameter('location', itemIndex, '') as string;\n\t\t\tconst current_company = executeFunctions.getNodeParameter('current_company', itemIndex, '') as string;\n\t\t\tconst picture_url = executeFunctions.getNodeParameter('picture_url', itemIndex, '') as string;\n\t\t\tconst tags = executeFunctions.getNodeParameter('tags', itemIndex, '') as string;\n\t\t\tconst status_id = executeFunctions.getNodeParameter('status_id', itemIndex, '') as string;\n\t\t\tconst contact_details = contactDetailsFromCollection(\n\t\t\t\texecuteFunctions.getNodeParameter('contact_details', itemIndex, {}),\n\t\t\t);\n\n\t\t\tconst body: IDataObject = {\n\t\t\t\tname,\n\t\t\t\tlinkedin_key,\n\t\t\t\t...(linkedin_user && { linkedin_user }),\n\t\t\t\t...(location && { location }),\n\t\t\t\t...(current_company && { current_company }),\n\t\t\t\t...(picture_url && { picture_url }),\n\t\t\t\t...(tags && { tags: tags.split(',').map((tag: string) => tag.trim()) }),\n\t\t\t\t...(status_id && { status_id }),\n\t\t\t\t...(contact_details && { contact_details }),\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\treturn await apiRequest(executeFunctions, 'POST', '/api/contacts', { body });\n\t\t\t} catch (error) {\n\t\t\t\t// The COUNT, never the values: this object is interpolated into a\n\t\t\t\t// NodeApiError message and n8n persists execution data, so the\n\t\t\t\t// numbers and addresses would sit in a third party's workflow\n\t\t\t\t// history. Author: Marco, 2026-08-10\n\t\t\t\tconst requestParams = contact_details\n\t\t\t\t\t? { ...body, contact_details: `${contact_details.length} entr(y|ies)` }\n\t\t\t\t\t: body;\n\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to create contact: ${(error as Error).message}. Request parameters: ${JSON.stringify(requestParams, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'get') {\n\t\t\tconst contactId = executeFunctions.getNodeParameter('contactId', itemIndex) as string;\n\n\t\t\treturn await apiRequest(executeFunctions, 'GET', `/api/contacts/${contactId}`);\n\t\t}\n\n\t\tif (operation === 'getAll') {\n\t\t\tconst returnAll = executeFunctions.getNodeParameter('returnAll', itemIndex, false) as boolean;\n\t\t\tconst search = executeFunctions.getNodeParameter('search', itemIndex, '') as string;\n\t\t\tconst tags = executeFunctions.getNodeParameter('tags', itemIndex, '') as string;\n\n\t\t\tconst qs: IDataObject = {};\n\t\t\tif (search) qs.search = search;\n\t\t\tif (tags) qs.tags = tags;\n\n\t\t\tif (!returnAll) {\n\t\t\t\tconst limit = executeFunctions.getNodeParameter('limit', itemIndex, 24);\n\t\t\t\tqs.pageSize = limit;\n\t\t\t\tqs.page = 1;\n\t\t\t}\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/contacts', { qs });\n\n\t\t\treturn Array.isArray(response) ? response : [response];\n\t\t}\n\n\t\tif (operation === 'update') {\n\t\t\tconst contactId = executeFunctions.getNodeParameter('contactId', itemIndex) as string;\n\t\t\tconst updateFields = executeFunctions.getNodeParameter('updateFields', itemIndex) as IDataObject;\n\n\t\t\t// The collection goes through as the request body verbatim, so the one\n\t\t\t// field whose n8n shape differs from the API's is rewritten here rather\n\t\t\t// than shipped as an object the route refuses.\n\t\t\t// Raises when rows were configured and none are usable: on update the\n\t\t\t// alternative is dropping the field and reporting success.\n\t\t\tconst contact_details = contactDetailsFromCollection(updateFields.contact_details, true);\n\t\t\tconst body: IDataObject = {\n\t\t\t\t...updateFields,\n\t\t\t\t...(contact_details ? {contact_details} : {}),\n\t\t\t};\n\t\t\tif (contact_details === undefined) delete body.contact_details;\n\n\t\t\treturn await apiRequest(executeFunctions, 'PUT', `/api/contacts/${contactId}`, { body });\n\t\t}\n\n\t\tif (operation === 'delete') {\n\t\t\tconst contactId = executeFunctions.getNodeParameter('contactId', itemIndex) as string;\n\n\t\t\tawait apiRequest(executeFunctions, 'DELETE', `/api/contacts/${contactId}`);\n\n\t\t\treturn { success: true };\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"contact\"!`,\n\t\t});\n\t}\n\n\tprivate static async executeNoteOperation(executeFunctions: IExecuteFunctions, itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'create') {\n\t\t\tconst content = executeFunctions.getNodeParameter('content', itemIndex) as string;\n\t\t\tconst contactId = executeFunctions.getNodeParameter('contactId', itemIndex) as string | number;\n\t\t\tconst visibility = executeFunctions.getNodeParameter('visibility', itemIndex, '') as string;\n\t\t\tconst ext_table_name = executeFunctions.getNodeParameter('ext_table_name', itemIndex, '') as string;\n\n\t\t\tconst body: IDataObject = {\n\t\t\t\tcontent,\n\t\t\t\tcontact_id: contactId,\n\t\t\t\t...(visibility && { visibility }),\n\t\t\t\t...(ext_table_name && { ext_table_name }),\n\t\t\t};\n\n\t\t\treturn await apiRequest(executeFunctions, 'POST', '/api/note', { body });\n\t\t}\n\n\t\tif (operation === 'get') {\n\t\t\tconst noteId = executeFunctions.getNodeParameter('noteId', itemIndex) as string | number;\n\n\t\t\treturn await apiRequest(executeFunctions, 'GET', `/api/note/${noteId}`);\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"note\"!`,\n\t\t});\n\t}\n\n\tprivate static async executeJobOperation(executeFunctions: IExecuteFunctions, itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'create') {\n\t\t\tconst name = executeFunctions.getNodeParameter('name', itemIndex) as string;\n\t\t\tconst company_name = executeFunctions.getNodeParameter('company_name', itemIndex) as string;\n\t\t\tconst status = executeFunctions.getNodeParameter('status', itemIndex, '') as string;\n\t\t\tconst description = executeFunctions.getNodeParameter('description', itemIndex, '') as string;\n\t\t\tconst location = executeFunctions.getNodeParameter('location', itemIndex, '') as string;\n\t\t\tconst remote_setting = executeFunctions.getNodeParameter('remote_setting', itemIndex, '') as string;\n\t\t\tconst company_url = executeFunctions.getNodeParameter('company_url', itemIndex, '') as string;\n\t\t\tconst provider = executeFunctions.getNodeParameter('provider', itemIndex, 'external') as string;\n\t\t\tconst url = executeFunctions.getNodeParameter('url', itemIndex, '') as string;\n\t\t\tconst ext_id = executeFunctions.getNodeParameter('ext_id', itemIndex, '') as string;\n\t\t\tconst picture_url = executeFunctions.getNodeParameter('picture_url', itemIndex, '') as string;\n\t\t\tconst tags = executeFunctions.getNodeParameter('tags', itemIndex, '') as string;\n\n\t\t\tlet status_id: number | undefined;\n\n\t\t\t// If status is provided, lookup the status ID\n\t\t\tif (status) {\n\t\t\t\tstatus_id = await resolveJobStatusId(executeFunctions, status);\n\t\t\t}\n\n\t\t\tconst body: IDataObject = {\n\t\t\t\tname,\n\t\t\t\tcompany_name,\n\t\t\t\t...(description && { description }),\n\t\t\t\t...(location && { location }),\n\t\t\t\t...(remote_setting && { remote_setting }),\n\t\t\t\t...(company_url && { company_url }),\n\t\t\t\t...(provider && { provider }),\n\t\t\t\t...(url && { url }),\n\t\t\t\t...(status_id && { status_id }),\n\t\t\t\t...(ext_id && { ext_id }),\n\t\t\t\t...(picture_url && picture_url !== 'Not Available' && { picture_url }),\n\t\t\t\t...(tags && { tags: tags.split(',').map((tag: string) => tag.trim()) }),\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\treturn await apiRequest(executeFunctions, 'POST', '/api/job', { body });\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to create job: ${(error as Error).message}. Request parameters: ${JSON.stringify(body, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'get') {\n\t\t\tconst jobId = executeFunctions.getNodeParameter('jobId', itemIndex) as string | number;\n\n\t\t\ttry {\n\t\t\t\treturn await apiRequest(executeFunctions, 'GET', `/api/job/${jobId}`);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to get job: ${(error as Error).message}. Request parameters: ${JSON.stringify({ jobId }, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'getAll') {\n\t\t\tconst returnAll = executeFunctions.getNodeParameter('returnAll', itemIndex, false) as boolean;\n\t\t\tconst search = executeFunctions.getNodeParameter('search', itemIndex, '') as string;\n\t\t\tconst tags = executeFunctions.getNodeParameter('tags', itemIndex, '') as string;\n\n\t\t\tconst qs: IDataObject = {};\n\t\t\tif (search) qs.search = search;\n\t\t\tif (tags) qs.tags = tags;\n\n\t\t\tif (!returnAll) {\n\t\t\t\tconst limit = executeFunctions.getNodeParameter('limit', itemIndex, 24);\n\t\t\t\tqs.pageSize = limit;\n\t\t\t\tqs.page = 1;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/job', { qs });\n\n\t\t\t\treturn Array.isArray(response) ? response : [response];\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to get all jobs: ${(error as Error).message}. Request parameters: ${JSON.stringify({ returnAll, search, tags, queryParams: qs }, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'update') {\n\t\t\tconst jobId = executeFunctions.getNodeParameter('jobId', itemIndex) as string | number;\n\t\t\tconst updateFields = executeFunctions.getNodeParameter('updateFields', itemIndex);\n\n\t\t\t// Handle status string lookup if provided\n\t\t\tif (updateFields.status && typeof updateFields.status === 'string') {\n\t\t\t\tupdateFields.status_id = await resolveJobStatusId(executeFunctions, updateFields.status);\n\t\t\t\tdelete updateFields.status;\n\t\t\t}\n\n\t\t\t// Process tags if provided as comma-separated string\n\t\t\tif (updateFields.tags && typeof updateFields.tags === 'string') {\n\t\t\t\tupdateFields.tags = (updateFields.tags).split(',').map((tag: string) => tag.trim());\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn await apiRequest(executeFunctions, 'PUT', `/api/job/${jobId}`, { body: updateFields });\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to update job: ${(error as Error).message}. Request parameters: ${JSON.stringify({ jobId, updateFields }, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'delete') {\n\t\t\tconst jobId = executeFunctions.getNodeParameter('jobId', itemIndex) as string | number;\n\n\t\t\ttry {\n\t\t\t\tawait apiRequest(executeFunctions, 'DELETE', `/api/job/${jobId}`);\n\n\t\t\t\treturn { success: true };\n\t\t\t} catch (error) {\n\t\t\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\t\t\tmessage: `Failed to delete job: ${(error as Error).message}. Request parameters: ${JSON.stringify({ jobId }, null, 2)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'search') {\n\t\t\tconst searchMethod = executeFunctions.getNodeParameter('searchMethod', itemIndex) as string;\n\t\t\tconst searchQuery = executeFunctions.getNodeParameter('searchQuery', itemIndex) as string;\n\t\t\tconst searchOptions = executeFunctions.getNodeParameter('searchOptions', itemIndex, {}) as IDataObject;\n\n\t\t\tconst qs: IDataObject = {};\n\n\t\t\t// Handle different search methods\n\t\t\tswitch (searchMethod) {\n\t\t\tcase 'general':\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t\tbreak;\n\t\t\tcase 'ext_id':\n\t\t\t\tqs.ext_id = searchQuery;\n\t\t\t\tbreak;\n\t\t\tcase 'title':\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t\tqs.searchField = 'title';\n\t\t\t\tbreak;\n\t\t\tcase 'company':\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t\tqs.searchField = 'company';\n\t\t\t\tbreak;\n\t\t\tcase 'location':\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t\tqs.searchField = 'location';\n\t\t\t\tbreak;\n\t\t\tcase 'description':\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t\tqs.searchField = 'description';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tqs.searchTerm = searchQuery;\n\t\t\t}\n\n\t\t\t// Add additional filter parameters\n\t\t\tif (searchOptions.remote_setting) qs.remote_setting = searchOptions.remote_setting;\n\t\t\tif (searchOptions.status) qs.status = searchOptions.status;\n\t\t\tif (searchOptions.tags) qs.tags = searchOptions.tags;\n\n\t\t\t// Set limit with default value\n\t\t\tconst limit = (searchOptions.limit as number) || 24;\n\t\t\tqs.pageSize = limit;\n\t\t\tqs.page = 1;\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/job', { qs });\n\n\t\t\treturn Array.isArray(response) ? response : [response];\n\t\t}\n\n\t\tif (operation === 'exists') {\n\t\t\tconst id = executeFunctions.getNodeParameter('id', itemIndex) as string;\n\n\t\t\t// Both catches below treat any failure as \"not found\".\n\t\t\tawait assertCredentials(executeFunctions);\n\n\t\t\ttry {\n\t\t\t\t// First try to get by job ID\n\t\t\t\ttry {\n\t\t\t\t\tawait apiRequest(executeFunctions, 'GET', `/api/job/${id}`);\n\t\t\t\t\t// If we get here, the job exists by ID\n\t\t\t\t\treturn { exists: true, found_by: 'job_id', id };\n\t\t\t\t} catch {\n\t\t\t\t\t// Job not found by ID, try searching by ext_id\n\t\t\t\t\tconst searchResponse = await apiRequest(executeFunctions, 'GET', '/api/job', {\n\t\t\t\t\t\tqs: { ext_id: id },\n\t\t\t\t\t});\n\n\t\t\t\t\t// Check if any results were returned\n\t\t\t\t\tconst results = Array.isArray(searchResponse) ? searchResponse : [searchResponse];\n\t\t\t\t\tif (results.length > 0 && results[0]) {\n\t\t\t\t\t\treturn { exists: true, found_by: 'ext_id', id };\n\t\t\t\t\t}\n\n\t\t\t\t\t// Not found by either ID or ext_id\n\t\t\t\t\treturn { exists: false, id };\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// If there's an error during the search, return false\n\t\t\t\treturn { exists: false, id, error: (error as Error).message };\n\t\t\t}\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"job\"!`,\n\t\t});\n\t}\n\n\tprivate static async executeStatusOperation(executeFunctions: IExecuteFunctions, itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'create') {\n\t\t\tconst name = executeFunctions.getNodeParameter('name', itemIndex) as string;\n\t\t\tconst type = executeFunctions.getNodeParameter('type', itemIndex) as string;\n\n\t\t\tconst body: IDataObject = { name, type };\n\n\t\t\treturn await apiRequest(executeFunctions, 'POST', '/api/statuses', { body });\n\t\t}\n\n\t\tif (operation === 'getAll') {\n\t\t\tconst type = executeFunctions.getNodeParameter('type', itemIndex, 'contact') as string;\n\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/statuses', { qs: { type } });\n\n\t\t\treturn Array.isArray(response) ? response : [response];\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"status\"!`,\n\t\t});\n\t}\n\n\tprivate static async executeTagOperation(executeFunctions: IExecuteFunctions, _itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'getAll') {\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/tags');\n\n\t\t\treturn Array.isArray(response) ? response : [response];\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"tag\"! Supported operations: getAll`,\n\t\t});\n\t}\n\n\tprivate static async executeUserOperation(executeFunctions: IExecuteFunctions, _itemIndex: number, operation: string): Promise<IDataObject | IDataObject[]> {\n\t\tif (operation === 'get') {\n\t\t\treturn await apiRequest(executeFunctions, 'GET', '/api/user');\n\t\t}\n\n\t\tif (operation === 'getCv') {\n\t\t\tconst response = await apiRequest(executeFunctions, 'GET', '/api/user');\n\n\t\t\t// Return only CV-related fields\n\t\t\tconst { cv, job_preferences, cv_updated_at } = response;\n\n\t\t\t// Parse job_preferences if it's a JSON string\n\t\t\tlet parsedPreferences = null;\n\t\t\tlet searchJobTitles = [];\n\t\t\tlet locations = [];\n\t\t\tlet titleBlacklist = [];\n\t\t\tlet companyBlacklist = [];\n\t\t\tlet penalize = [];\n\n\t\t\tif (job_preferences) {\n\t\t\t\ttry {\n\t\t\t\t\tparsedPreferences = typeof job_preferences === 'string'\n\t\t\t\t\t\t? JSON.parse(job_preferences)\n\t\t\t\t\t\t: job_preferences;\n\n\t\t\t\t\tsearchJobTitles = parsedPreferences.searchJobTitles ?? [];\n\t\t\t\t\tlocations = parsedPreferences.locations ?? [];\n\n\t\t\t\t\t// Handle both new blacklist structure and legacy structure\n\t\t\t\t\tif (parsedPreferences.blacklist) {\n\t\t\t\t\t\ttitleBlacklist = parsedPreferences.blacklist.titleBlacklist ?? [];\n\t\t\t\t\t\tcompanyBlacklist = parsedPreferences.blacklist.companyBlacklist ?? [];\n\t\t\t\t\t\tpenalize = parsedPreferences.blacklist.penalize ?? [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Legacy support\n\t\t\t\t\t\ttitleBlacklist = parsedPreferences.titleBlacklist ?? [];\n\t\t\t\t\t\tcompanyBlacklist = parsedPreferences.companyBlacklist ?? [];\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// If parsing fails, keep empty arrays\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcv,\n\t\t\t\tjob_preferences: parsedPreferences,\n\t\t\t\tcv_updated_at,\n\t\t\t\tsearchJobTitles: searchJobTitles.join(', '),\n\t\t\t\tlocations: locations.join(', '),\n\t\t\t\ttitleBlacklist: titleBlacklist.join(', '),\n\t\t\t\tcompanyBlacklist: companyBlacklist.join(', '),\n\t\t\t\tpenalize: penalize.join(', '),\n\t\t\t};\n\t\t}\n\n\t\tthrow new NodeApiError(executeFunctions.getNode(), {\n\t\t\tmessage: `The operation \"${operation}\" is not supported for resource \"user\"! Supported operations: get, getCv`,\n\t\t});\n\t}\n}\n"]}
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-innotes",
3
- "version": "2.0.18",
3
+ "version": "2.0.20",
4
4
  "description": "N8N node for InNotes CRM API integration",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-innotes",
3
- "version": "2.0.18",
3
+ "version": "2.0.20",
4
4
  "description": "N8N node for InNotes CRM API integration",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",