From a1fed27229a15e00ecd3a133c7a728bd9cc45245 Mon Sep 17 00:00:00 2001 From: quansenB Date: Thu, 24 Oct 2019 20:15:57 +0200 Subject: [PATCH 01/66] add CRUD deal descriptions --- packages/editor-ui/jsnon cop passte | 1 + packages/editor-ui/package.json | 4 +- .../ActiveCampaign/ActiveCampaign.node.ts | 496 +++++++++++++++++- 3 files changed, 498 insertions(+), 3 deletions(-) create mode 100644 packages/editor-ui/jsnon cop passte diff --git a/packages/editor-ui/jsnon cop passte b/packages/editor-ui/jsnon cop passte new file mode 100644 index 000000000..dbfd27f67 --- /dev/null +++ b/packages/editor-ui/jsnon cop passte @@ -0,0 +1 @@ +//VUE_APP_URL_BASE_API=http://localhost:5678/ \ No newline at end of file diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 7047295fb..82534d8a8 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -17,7 +17,7 @@ "build": "vue-cli-service build", "dev": "npm run serve", "lint": "vue-cli-service lint", - "serve": "VUE_APP_URL_BASE_API=http://localhost:5678/ vue-cli-service serve", + "serve": "vue-cli-service serve", "test": "npm run test:unit", "tslint": "tslint -p tsconfig.json -c tslint.json", "test:e2e": "vue-cli-service test:e2e", @@ -78,4 +78,4 @@ "vue-typed-mixins": "^0.1.0", "vuex": "^3.1.1" } -} +} \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index e6efe9745..d4fb4edca 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -59,6 +59,10 @@ export class ActiveCampaign implements INodeType { } ], properties: [ + + // ---------------------------------- + // resources + // ---------------------------------- { displayName: 'Resource', name: 'resource', @@ -68,6 +72,10 @@ export class ActiveCampaign implements INodeType { name: 'Contact', value: 'contact', }, + { + name: 'Deal', + value: 'deal', + } ], default: 'contact', description: 'The resource to operate on.', @@ -120,6 +128,48 @@ export class ActiveCampaign implements INodeType { description: 'The operation to perform.', }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'deal', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a deal', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a deal', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a deal', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all deals', + }, + { + name: 'Update', + value: 'update', + description: 'Update a deal', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, + // ---------------------------------- @@ -261,7 +311,7 @@ export class ActiveCampaign implements INodeType { }, // ---------------------------------- - // person:get + // contact:get // ---------------------------------- { displayName: 'Contact ID', @@ -429,7 +479,451 @@ export class ActiveCampaign implements INodeType { }, ], }, + // ---------------------------------- + // deal + // ---------------------------------- + // ---------------------------------- + // deal:create + // ---------------------------------- + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The title of the deal', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The description of the deal', + }, + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal', + }, + { + displayName: 'Deal value', + name: 'dealValue', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The value of the deal in cents', + }, + { + displayName: 'Currency', + name: 'currency', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The currency of the deal in 3-character ISO format', + }, + { + displayName: 'Deal group ID', + name: 'dealGroup', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The group ID of the deal', + }, + { + displayName: 'Deal stage ID', + name: 'dealStage', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The stage ID of the deal', + }, + { + displayName: 'Deal owner ID', + name: 'dealOwner', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The owner ID of the deal', + }, + { + displayName: 'Deal percentage', + name: 'dealPercentage', + type: 'number', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The percentage of the deal', + }, + { + displayName: 'Deal status', + name: 'dealStatus', + type: 'number', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The status of the deal', + }, + + // ---------------------------------- + // deal:delete + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal', + }, + + // ---------------------------------- + // deal:get + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal', + }, + + // ---------------------------------- + // deal:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'deal', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'deal', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, + + // ---------------------------------- + // deal:update + // ---------------------------------- + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The title of the deal', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The description of the deal', + }, + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal', + }, + { + displayName: 'Deal value', + name: 'dealValue', + type: 'number', + default: '', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The value of the deal in cents', + }, + { + displayName: 'Currency', + name: 'currency', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The currency of the deal in 3-character ISO format', + }, + { + displayName: 'Deal group ID', + name: 'dealGroup', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The group ID of the deal', + }, + { + displayName: 'Deal stage ID', + name: 'dealStage', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The stage ID of the deal', + }, + { + displayName: 'Deal owner ID', + name: 'dealOwner', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The owner ID of the deal', + }, + { + displayName: 'Deal percentage', + name: 'dealPercentage', + type: 'number', + default: '', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The percentage of the deal', + }, + { + displayName: 'Deal status', + name: 'dealStatus', + type: 'number', + default: '', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The status of the deal', + }, ], }; From 445384a590d79f0edd1118b462686d14106a6f2f Mon Sep 17 00:00:00 2001 From: quansenB Date: Thu, 24 Oct 2019 20:21:28 +0200 Subject: [PATCH 02/66] deal-note-description --- .../ActiveCampaign/ActiveCampaign.node.ts | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index d4fb4edca..433bbc754 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -165,6 +165,16 @@ export class ActiveCampaign implements INodeType { value: 'update', description: 'Update a deal', }, + { + name: 'Create Note', + value: 'createNote', + description: 'Create a deal note', + }, + { + name: 'Update deal note', + value: 'updateNote', + description: 'Update a deal note', + }, ], default: 'create', description: 'The operation to perform.', @@ -924,6 +934,85 @@ export class ActiveCampaign implements INodeType { }, description: 'The status of the deal', }, + + // ---------------------------------- + // dealNote:create + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'createNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal note', + }, + { + displayName: 'Deal Note', + name: 'dealNote', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'createNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The content of the deal note', + }, + + // ---------------------------------- + // dealNote:update + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'updateNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal note', + }, + { + displayName: 'Deal Note', + name: 'dealNote', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'updateNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The content of the deal note', + }, ], }; From c8bd2d538d3136f3bbbf4d5f03243b3fb2b34d7f Mon Sep 17 00:00:00 2001 From: quansenB Date: Thu, 24 Oct 2019 20:29:45 +0200 Subject: [PATCH 03/66] rename misspelled file --- packages/editor-ui/{jsnon cop passte => package json debug} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/editor-ui/{jsnon cop passte => package json debug} (100%) diff --git a/packages/editor-ui/jsnon cop passte b/packages/editor-ui/package json debug similarity index 100% rename from packages/editor-ui/jsnon cop passte rename to packages/editor-ui/package json debug From cd28bbcbdc0ff472f7547eeb44b40814d318d11f Mon Sep 17 00:00:00 2001 From: quansenB Date: Thu, 24 Oct 2019 20:50:57 +0200 Subject: [PATCH 04/66] rename deal id --- .../nodes/ActiveCampaign/ActiveCampaign.node.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 433bbc754..b4dcbf57d 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -532,8 +532,8 @@ export class ActiveCampaign implements INodeType { description: 'The description of the deal', }, { - displayName: 'Deal ID', - name: 'dealId', + displayName: 'Deal\'s contact ID', + name: 'contactId', type: 'number', default: '', required: true, @@ -547,7 +547,7 @@ export class ActiveCampaign implements INodeType { ], }, }, - description: 'The ID of the deal', + description: 'The ID of the deal\'s contact', }, { displayName: 'Deal value', @@ -799,8 +799,8 @@ export class ActiveCampaign implements INodeType { description: 'The description of the deal', }, { - displayName: 'Deal ID', - name: 'dealId', + displayName: 'Deal\'s contact ID', + name: 'contactId', type: 'number', default: '', displayOptions: { @@ -813,7 +813,7 @@ export class ActiveCampaign implements INodeType { ], }, }, - description: 'The ID of the deal', + description: 'The ID of the deal\'s contact', }, { displayName: 'Deal value', @@ -974,7 +974,7 @@ export class ActiveCampaign implements INodeType { }, description: 'The content of the deal note', }, - + // ---------------------------------- // dealNote:update // ---------------------------------- From e896c1c319b1b92b7215e0b9d88cef73b8c1fa08 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 02:50:03 +0200 Subject: [PATCH 05/66] rorder resources --- .../ActiveCampaign/ActiveCampaign.node.ts | 361 +++++++++--------- 1 file changed, 182 insertions(+), 179 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index b4dcbf57d..4cd415c1f 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -297,96 +297,7 @@ export class ActiveCampaign implements INodeType { }, ], }, - - // ---------------------------------- - // contact:delete - // ---------------------------------- - { - displayName: 'Contact ID', - name: 'contactId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'contact', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the contact to delete.', - }, - - // ---------------------------------- - // contact:get - // ---------------------------------- - { - displayName: 'Contact ID', - name: 'contactId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'contact', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the contact to get.', - }, - - // ---------------------------------- - // contact:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'contact', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'contact', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, - + // ---------------------------------- // contact:update // ---------------------------------- @@ -489,6 +400,97 @@ export class ActiveCampaign implements INodeType { }, ], }, + + // ---------------------------------- + // contact:delete + // ---------------------------------- + { + displayName: 'Contact ID', + name: 'contactId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'contact', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the contact to delete.', + }, + + // ---------------------------------- + // contact:get + // ---------------------------------- + { + displayName: 'Contact ID', + name: 'contactId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'contact', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the contact to get.', + }, + + // ---------------------------------- + // contact:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contact', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contact', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, + + // ---------------------------------- // deal // ---------------------------------- @@ -671,95 +673,6 @@ export class ActiveCampaign implements INodeType { description: 'The status of the deal', }, - // ---------------------------------- - // deal:delete - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal', - }, - - // ---------------------------------- - // deal:get - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal', - }, - - // ---------------------------------- - // deal:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'deal', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'deal', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, - // ---------------------------------- // deal:update // ---------------------------------- @@ -935,6 +848,96 @@ export class ActiveCampaign implements INodeType { description: 'The status of the deal', }, + + // ---------------------------------- + // deal:delete + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal', + }, + + // ---------------------------------- + // deal:get + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal', + }, + + // ---------------------------------- + // deal:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'deal', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'deal', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, + // ---------------------------------- // dealNote:create // ---------------------------------- From 683c889a14e7318866a2e3d0fe7a528902826e7e Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 14:24:24 +0200 Subject: [PATCH 06/66] set up functionality layout --- .../ActiveCampaign/ActiveCampaign.node.ts | 107 ++++++++++++++---- 1 file changed, 86 insertions(+), 21 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 4cd415c1f..475f712be 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -297,7 +297,7 @@ export class ActiveCampaign implements INodeType { }, ], }, - + // ---------------------------------- // contact:update // ---------------------------------- @@ -672,7 +672,7 @@ export class ActiveCampaign implements INodeType { }, description: 'The status of the deal', }, - + // ---------------------------------- // deal:update // ---------------------------------- @@ -848,7 +848,7 @@ export class ActiveCampaign implements INodeType { description: 'The status of the deal', }, - + // ---------------------------------- // deal:delete // ---------------------------------- @@ -892,7 +892,7 @@ export class ActiveCampaign implements INodeType { }, description: 'The ID of the deal', }, - + // ---------------------------------- // deal:getAll // ---------------------------------- @@ -1120,24 +1120,89 @@ export class ActiveCampaign implements INodeType { addAdditionalFields(body.contact as IDataObject, updateFields); } - } else { - throw new Error(`The resource "${resource}" is not known!`); + } else if (resource === 'deal') { + if (operation === 'create') { + // ---------------------------------- + // deal:create + // ---------------------------------- + + requestMethod = 'POST'; + + dataKey = 'deal'; + body.deal = { + email: this.getNodeParameter('email', i) as string, + } as IDataObject; + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + addAdditionalFields(body.deal as IDataObject, additionalFields); + + } else if (operation === 'delete') { + // ---------------------------------- + // deal:delete + // ---------------------------------- + + requestMethod = 'DELETE'; + + const dealId = this.getNodeParameter('dealId', i) as number; + endpoint = `/api/3/deals/${dealId}`; + + } else if (operation === 'get') { + // ---------------------------------- + // deal:get + // ---------------------------------- + + requestMethod = 'GET'; + + const dealId = this.getNodeParameter('dealId', i) as number; + endpoint = `/api/3/deals/${dealId}`; + + } else if (operation === 'getAll') { + // ---------------------------------- + // persons:getAll + // ---------------------------------- + + requestMethod = 'GET'; + + returnAll = this.getNodeParameter('returnAll', i) as boolean; + if (returnAll === false) { + qs.limit = this.getNodeParameter('limit', i) as number; + } + + dataKey = 'deals'; + endpoint = `/api/3/deals`; + + } else if (operation === 'update') { + // ---------------------------------- + // deal:update + // ---------------------------------- + + requestMethod = 'PUT'; + + const dealId = this.getNodeParameter('dealId', i) as number; + endpoint = `/api/3/deals/${dealId}`; + + dataKey = 'deal'; + body.deal = {} as IDataObject; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + addAdditionalFields(body.deal as IDataObject, updateFields); + + } else { + throw new Error(`The resource "${resource}" is not known!`); + } + + let responseData; + if (returnAll === true) { + responseData = await activeCampaignApiRequestAllItems.call(this, requestMethod, endpoint, body, qs, dataKey); + } else { + responseData = await activeCampaignApiRequest.call(this, requestMethod, endpoint, body, qs, dataKey); + } + + if (Array.isArray(responseData)) { + returnData.push.apply(returnData, responseData as IDataObject[]); + } else { + returnData.push(responseData as IDataObject); + } } - let responseData; - if (returnAll === true) { - responseData = await activeCampaignApiRequestAllItems.call(this, requestMethod, endpoint, body, qs, dataKey); - } else { - responseData = await activeCampaignApiRequest.call(this, requestMethod, endpoint, body, qs, dataKey); - } - - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else { - returnData.push(responseData as IDataObject); - } + return [this.helpers.returnJsonArray(returnData)]; } - - return [this.helpers.returnJsonArray(returnData)]; } -} From 16e9c41f2793b5bc2e042a9d668b781d8759806d Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 14:50:15 +0200 Subject: [PATCH 07/66] fix some small things in node description --- .../ActiveCampaign/ActiveCampaign.node.ts | 53 ++++++++++++------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 475f712be..39042adad 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -12,6 +12,7 @@ import { activeCampaignApiRequest, activeCampaignApiRequestAllItems, } from './GenericFunctions'; +import { type } from 'os'; interface CustomProperty { name: string; @@ -500,7 +501,7 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- { displayName: 'Title', - name: 'title', + name: 'dealTitle', type: 'string', default: '', required: true, @@ -518,7 +519,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Description', - name: 'description', + name: 'dealDescription', type: 'string', default: '', displayOptions: { @@ -535,9 +536,9 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Deal\'s contact ID', - name: 'contactId', + name: 'dealContactId', type: 'number', - default: '', + default: 0, required: true, displayOptions: { show: { @@ -555,7 +556,7 @@ export class ActiveCampaign implements INodeType { displayName: 'Deal value', name: 'dealValue', type: 'number', - default: '', + default: 0, required: true, displayOptions: { show: { @@ -571,7 +572,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Currency', - name: 'currency', + name: 'dealCurrency', type: 'string', default: '', required: true, @@ -642,7 +643,7 @@ export class ActiveCampaign implements INodeType { displayName: 'Deal percentage', name: 'dealPercentage', type: 'number', - default: '', + default: 0, displayOptions: { show: { operation: [ @@ -659,7 +660,7 @@ export class ActiveCampaign implements INodeType { displayName: 'Deal status', name: 'dealStatus', type: 'number', - default: '', + default: 0, displayOptions: { show: { operation: [ @@ -678,7 +679,7 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- { displayName: 'Title', - name: 'title', + name: 'dealTitle', type: 'string', default: '', required: true, @@ -696,7 +697,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Description', - name: 'description', + name: 'dealDescription', type: 'string', default: '', displayOptions: { @@ -713,9 +714,9 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Deal\'s contact ID', - name: 'contactId', + name: 'dealContactId', type: 'number', - default: '', + default: 0, displayOptions: { show: { operation: [ @@ -732,7 +733,7 @@ export class ActiveCampaign implements INodeType { displayName: 'Deal value', name: 'dealValue', type: 'number', - default: '', + default: 0, displayOptions: { show: { operation: [ @@ -747,7 +748,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Currency', - name: 'currency', + name: 'dealCurrency', type: 'string', default: '', displayOptions: { @@ -817,7 +818,7 @@ export class ActiveCampaign implements INodeType { displayName: 'Deal percentage', name: 'dealPercentage', type: 'number', - default: '', + default: 0, displayOptions: { show: { operation: [ @@ -834,7 +835,7 @@ export class ActiveCampaign implements INodeType { displayName: 'Deal status', name: 'dealStatus', type: 'number', - default: '', + default: 0, displayOptions: { show: { operation: [ @@ -1129,11 +1130,25 @@ export class ActiveCampaign implements INodeType { requestMethod = 'POST'; dataKey = 'deal'; + + let currency = this.getNodeParameter('dealCurrency', i) as string; + if(currency.length !== 3){ + currency = currency.toLowerCase(); + } + body.deal = { - email: this.getNodeParameter('email', i) as string, + title: this.getNodeParameter('title', i) as string, + contact: this.getNodeParameter('contactId', i) as string, + value: this.getNodeParameter('value', i) as number, + currency, } as IDataObject; - const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; - addAdditionalFields(body.deal as IDataObject, additionalFields); + + let dealDescription = this.getNodeParameter('description', i) as string; + let dealGroup = this.getNodeParameter('dealGroup', i) as string; + let dealStage = this.getNodeParameter('dealStage', i) as string; + let dealPercentage = this.getNodeParameter('dealPercentage', i) as number; + let dealStatus = this.getNodeParameter('dealStatus', i) as number; + } else if (operation === 'delete') { // ---------------------------------- From 8b7398bf393893cb2d59dd1ac5f9371c7ff3a2f3 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 14:51:46 +0200 Subject: [PATCH 08/66] add dealId to update decription --- .../ActiveCampaign/ActiveCampaign.node.ts | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 39042adad..2842f23b4 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -677,6 +677,24 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- // deal:update // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal', + }, { displayName: 'Title', name: 'dealTitle', @@ -857,7 +875,7 @@ export class ActiveCampaign implements INodeType { displayName: 'Deal ID', name: 'dealId', type: 'number', - default: '', + default: 0, required: true, displayOptions: { show: { @@ -879,7 +897,7 @@ export class ActiveCampaign implements INodeType { displayName: 'Deal ID', name: 'dealId', type: 'number', - default: '', + default: 0, required: true, displayOptions: { show: { From f5c585c7be6721e84080f45813cb083a9879e5ef Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 15:47:43 +0200 Subject: [PATCH 09/66] add not required fields to body.deal obj --- .../ActiveCampaign/ActiveCampaign.node.ts | 65 ++++++++++++++----- 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 2842f23b4..b9d28cf88 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -38,6 +38,17 @@ function addAdditionalFields(body: IDataObject, additionalFields: IDataObject) { } } +/** + * Add one additional field to the body + * + * @param {IDataObject} body The body object to add the field to + * @param {IDataObject} additionalField The field to add + */ +function addAdditionalField(body: IDataObject, additionalField: string | number) { + body.additionalField = additionalField; +} + + export class ActiveCampaign implements INodeType { description: INodeTypeDescription = { displayName: 'ActiveCampaign', @@ -1148,25 +1159,47 @@ export class ActiveCampaign implements INodeType { requestMethod = 'POST'; dataKey = 'deal'; - - let currency = this.getNodeParameter('dealCurrency', i) as string; - if(currency.length !== 3){ - currency = currency.toLowerCase(); - } - + body.deal = { - title: this.getNodeParameter('title', i) as string, - contact: this.getNodeParameter('contactId', i) as string, - value: this.getNodeParameter('value', i) as number, - currency, + title: this.getNodeParameter('dealTitle', i) as string, + contact: this.getNodeParameter('dealContactId', i) as string, + value: this.getNodeParameter('dealValue', i) as number, + currency: '', } as IDataObject; - let dealDescription = this.getNodeParameter('description', i) as string; - let dealGroup = this.getNodeParameter('dealGroup', i) as string; - let dealStage = this.getNodeParameter('dealStage', i) as string; - let dealPercentage = this.getNodeParameter('dealPercentage', i) as number; - let dealStatus = this.getNodeParameter('dealStatus', i) as number; - + let currency= this.getNodeParameter('dealCurrency', i) as string + if (currency.length === 3) { + currency = currency.toLowerCase(); + addAdditionalField(body.deal as IDataObject, currency) + } else { + throw new Error('Currency must be in 3-character ISO format') + } + + let description = this.getNodeParameter('dealDescription', i) as string; + if (description.length !== 0){ + addAdditionalField(body.deal as IDataObject, description) + } + + let group = this.getNodeParameter('dealGroup', i) as string; + if (group.length !== 0){ + addAdditionalField(body.deal as IDataObject, group) + } + + let stage = this.getNodeParameter('dealStage', i) as string; + if (stage.length !== 0){ + addAdditionalField(body.deal as IDataObject, stage) + } + + let percentage = this.getNodeParameter('dealPercentage', i) as number; + if (percentage !== 0){ + addAdditionalField(body.deal as IDataObject, percentage) + } + + let status = this.getNodeParameter('dealStatus', i) as number; + if (status !== 0){ + addAdditionalField(body.deal as IDataObject, status) + } + } else if (operation === 'delete') { // ---------------------------------- From 0034a17b17d8975b12d3b3511693affdc05ced31 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 16:15:01 +0200 Subject: [PATCH 10/66] revert to addition fields design choice --- .../ActiveCampaign/ActiveCampaign.node.ts | 313 ++++++------------ 1 file changed, 103 insertions(+), 210 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index b9d28cf88..0af2409e1 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -528,23 +528,6 @@ export class ActiveCampaign implements INodeType { }, description: 'The title of the deal', }, - { - displayName: 'Description', - name: 'dealDescription', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The description of the deal', - }, { displayName: 'Deal\'s contact ID', name: 'dealContactId', @@ -600,10 +583,10 @@ export class ActiveCampaign implements INodeType { description: 'The currency of the deal in 3-character ISO format', }, { - displayName: 'Deal group ID', - name: 'dealGroup', - type: 'string', - default: '', + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', displayOptions: { show: { operation: [ @@ -614,75 +597,51 @@ export class ActiveCampaign implements INodeType { ], }, }, - description: 'The group ID of the deal', - }, - { - displayName: 'Deal stage ID', - name: 'dealStage', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], + default: {}, + options: [ + { + displayName: 'Description', + name: 'dealDescription', + type: 'string', + default: '', + description: 'The description of the deal', }, - }, - description: 'The stage ID of the deal', - }, - { - displayName: 'Deal owner ID', - name: 'dealOwner', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], + { + displayName: 'Deal group ID', + name: 'dealGroup', + type: 'string', + default: '', + description: 'The group ID of the deal', }, - }, - description: 'The owner ID of the deal', - }, - { - displayName: 'Deal percentage', - name: 'dealPercentage', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], + { + displayName: 'Deal stage ID', + name: 'dealStage', + type: 'string', + default: '', + description: 'The stage ID of the deal', }, - }, - description: 'The percentage of the deal', - }, - { - displayName: 'Deal status', - name: 'dealStatus', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], + { + displayName: 'Deal owner ID', + name: 'dealOwner', + type: 'string', + default: '', + description: 'The owner ID of the deal', }, - }, - description: 'The status of the deal', + { + displayName: 'Deal percentage', + name: 'dealPercentage', + type: 'number', + default: 0, + description: 'The percentage of the deal', + }, + { + displayName: 'Deal status', + name: 'dealStatus', + type: 'number', + default: 0, + description: 'The status of the deal', + }, + ] }, // ---------------------------------- @@ -715,7 +674,7 @@ export class ActiveCampaign implements INodeType { displayOptions: { show: { operation: [ - 'update', + 'create', ], resource: [ 'deal', @@ -724,32 +683,16 @@ export class ActiveCampaign implements INodeType { }, description: 'The title of the deal', }, - { - displayName: 'Description', - name: 'dealDescription', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The description of the deal', - }, { displayName: 'Deal\'s contact ID', name: 'dealContactId', type: 'number', default: 0, + required: true, displayOptions: { show: { operation: [ - 'update', + 'create', ], resource: [ 'deal', @@ -763,10 +706,11 @@ export class ActiveCampaign implements INodeType { name: 'dealValue', type: 'number', default: 0, + required: true, displayOptions: { show: { operation: [ - 'update', + 'create', ], resource: [ 'deal', @@ -780,10 +724,11 @@ export class ActiveCampaign implements INodeType { name: 'dealCurrency', type: 'string', default: '', + required: true, displayOptions: { show: { operation: [ - 'update', + 'create', ], resource: [ 'deal', @@ -793,89 +738,65 @@ export class ActiveCampaign implements INodeType { description: 'The currency of the deal in 3-character ISO format', }, { - displayName: 'Deal group ID', - name: 'dealGroup', - type: 'string', - default: '', + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', displayOptions: { show: { operation: [ - 'update', + 'create', ], resource: [ 'deal', ], }, }, - description: 'The group ID of the deal', - }, - { - displayName: 'Deal stage ID', - name: 'dealStage', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'deal', - ], + default: {}, + options: [ + { + displayName: 'Description', + name: 'dealDescription', + type: 'string', + default: '', + description: 'The description of the deal', }, - }, - description: 'The stage ID of the deal', - }, - { - displayName: 'Deal owner ID', - name: 'dealOwner', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'deal', - ], + { + displayName: 'Deal group ID', + name: 'dealGroup', + type: 'string', + default: '', + description: 'The group ID of the deal', }, - }, - description: 'The owner ID of the deal', - }, - { - displayName: 'Deal percentage', - name: 'dealPercentage', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'deal', - ], + { + displayName: 'Deal stage ID', + name: 'dealStage', + type: 'string', + default: '', + description: 'The stage ID of the deal', }, - }, - description: 'The percentage of the deal', - }, - { - displayName: 'Deal status', - name: 'dealStatus', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'deal', - ], + { + displayName: 'Deal owner ID', + name: 'dealOwner', + type: 'string', + default: '', + description: 'The owner ID of the deal', }, - }, - description: 'The status of the deal', + { + displayName: 'Deal percentage', + name: 'dealPercentage', + type: 'number', + default: 0, + description: 'The percentage of the deal', + }, + { + displayName: 'Deal status', + name: 'dealStatus', + type: 'number', + default: 0, + description: 'The status of the deal', + }, + ] }, @@ -1159,46 +1080,18 @@ export class ActiveCampaign implements INodeType { requestMethod = 'POST'; dataKey = 'deal'; - + body.deal = { title: this.getNodeParameter('dealTitle', i) as string, contact: this.getNodeParameter('dealContactId', i) as string, value: this.getNodeParameter('dealValue', i) as number, - currency: '', } as IDataObject; - let currency= this.getNodeParameter('dealCurrency', i) as string - if (currency.length === 3) { - currency = currency.toLowerCase(); - addAdditionalField(body.deal as IDataObject, currency) - } else { - throw new Error('Currency must be in 3-character ISO format') - } + let currency = this.getNodeParameter('dealCurrency', i).toString().toLowerCase() as string + addAdditionalField(body.deal as IDataObject, currency) - let description = this.getNodeParameter('dealDescription', i) as string; - if (description.length !== 0){ - addAdditionalField(body.deal as IDataObject, description) - } - - let group = this.getNodeParameter('dealGroup', i) as string; - if (group.length !== 0){ - addAdditionalField(body.deal as IDataObject, group) - } - - let stage = this.getNodeParameter('dealStage', i) as string; - if (stage.length !== 0){ - addAdditionalField(body.deal as IDataObject, stage) - } - - let percentage = this.getNodeParameter('dealPercentage', i) as number; - if (percentage !== 0){ - addAdditionalField(body.deal as IDataObject, percentage) - } - - let status = this.getNodeParameter('dealStatus', i) as number; - if (status !== 0){ - addAdditionalField(body.deal as IDataObject, status) - } + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + addAdditionalFields(body.deal as IDataObject, additionalFields); } else if (operation === 'delete') { From 4f1a0961392cd652a64080e2bb5f1c55cd038c51 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 16:25:16 +0200 Subject: [PATCH 11/66] refactor deal update to take add field format --- .../ActiveCampaign/ActiveCampaign.node.ts | 147 +++++++----------- 1 file changed, 52 insertions(+), 95 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 0af2409e1..d7f0fec8a 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -651,8 +651,6 @@ export class ActiveCampaign implements INodeType { displayName: 'Deal ID', name: 'dealId', type: 'number', - default: 0, - required: true, displayOptions: { show: { operation: [ @@ -663,97 +661,56 @@ export class ActiveCampaign implements INodeType { ], }, }, - description: 'The ID of the deal', - }, - { - displayName: 'Title', - name: 'dealTitle', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The title of the deal', - }, - { - displayName: 'Deal\'s contact ID', - name: 'dealContactId', - type: 'number', default: 0, required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal\'s contact', + description: 'ID of the deal to update.', }, { - displayName: 'Deal value', - name: 'dealValue', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The value of the deal in cents', - }, - { - displayName: 'Currency', - name: 'dealCurrency', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The currency of the deal in 3-character ISO format', - }, - { - displayName: 'Additional Fields', - name: 'additionalFields', + displayName: 'Update Fields', + name: 'updateFields', type: 'collection', + description: 'The fields to update.', placeholder: 'Add Field', displayOptions: { show: { operation: [ - 'create', + 'update', ], resource: [ - 'deal', + 'contact', ], }, }, default: {}, options: [ + { + displayName: 'Title', + name: 'dealTitle', + type: 'string', + default: '', + description: 'The title of the deal', + }, + { + displayName: 'Deal\'s contact ID', + name: 'dealContactId', + type: 'number', + default: 0, + description: 'The ID of the deal\'s contact', + }, + { + displayName: 'Deal value', + name: 'dealValue', + type: 'number', + default: 0, + description: 'The value of the deal in cents', + }, + { + displayName: 'Currency', + name: 'dealCurrency', + type: 'string', + default: '', + description: 'The currency of the deal in 3-character ISO format', + }, { displayName: 'Description', name: 'dealDescription', @@ -798,8 +755,7 @@ export class ActiveCampaign implements INodeType { }, ] }, - - + // ---------------------------------- // deal:delete // ---------------------------------- @@ -1079,6 +1035,8 @@ export class ActiveCampaign implements INodeType { requestMethod = 'POST'; + endpoint = '/api/3/deals'; + dataKey = 'deal'; body.deal = { @@ -1094,6 +1052,21 @@ export class ActiveCampaign implements INodeType { addAdditionalFields(body.deal as IDataObject, additionalFields); + } else if (operation === 'update') { + // ---------------------------------- + // deal:update + // ---------------------------------- + + requestMethod = 'PUT'; + + const dealId = this.getNodeParameter('dealId', i) as number; + endpoint = `/api/3/deals/${dealId}`; + + dataKey = 'deal'; + body.deal = {} as IDataObject; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + addAdditionalFields(body.deal as IDataObject, updateFields); + } else if (operation === 'delete') { // ---------------------------------- // deal:delete @@ -1128,22 +1101,6 @@ export class ActiveCampaign implements INodeType { dataKey = 'deals'; endpoint = `/api/3/deals`; - - } else if (operation === 'update') { - // ---------------------------------- - // deal:update - // ---------------------------------- - - requestMethod = 'PUT'; - - const dealId = this.getNodeParameter('dealId', i) as number; - endpoint = `/api/3/deals/${dealId}`; - - dataKey = 'deal'; - body.deal = {} as IDataObject; - const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; - addAdditionalFields(body.deal as IDataObject, updateFields); - } else { throw new Error(`The resource "${resource}" is not known!`); } From 819efc50e5da01c9e545ff35a3f0a74a5ff893a5 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 16:30:58 +0200 Subject: [PATCH 12/66] add error handling for unknon operations --- .../ActiveCampaign/ActiveCampaign.node.ts | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index d7f0fec8a..37385bbe6 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -755,7 +755,7 @@ export class ActiveCampaign implements INodeType { }, ] }, - + // ---------------------------------- // deal:delete // ---------------------------------- @@ -1026,6 +1026,8 @@ export class ActiveCampaign implements INodeType { const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; addAdditionalFields(body.contact as IDataObject, updateFields); + } else { + throw new Error(`The operation ${operation} is not known`); } } else if (resource === 'deal') { if (operation === 'create') { @@ -1102,23 +1104,26 @@ export class ActiveCampaign implements INodeType { dataKey = 'deals'; endpoint = `/api/3/deals`; } else { - throw new Error(`The resource "${resource}" is not known!`); - } - - let responseData; - if (returnAll === true) { - responseData = await activeCampaignApiRequestAllItems.call(this, requestMethod, endpoint, body, qs, dataKey); - } else { - responseData = await activeCampaignApiRequest.call(this, requestMethod, endpoint, body, qs, dataKey); - } - - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else { - returnData.push(responseData as IDataObject); + throw new Error(`The operation ${operation} is not known`); } + } else { + throw new Error(`The resource "${resource}" is not known!`); } - return [this.helpers.returnJsonArray(returnData)]; + let responseData; + if (returnAll === true) { + responseData = await activeCampaignApiRequestAllItems.call(this, requestMethod, endpoint, body, qs, dataKey); + } else { + responseData = await activeCampaignApiRequest.call(this, requestMethod, endpoint, body, qs, dataKey); + } + + if (Array.isArray(responseData)) { + returnData.push.apply(returnData, responseData as IDataObject[]); + } else { + returnData.push(responseData as IDataObject); + } } + + return [this.helpers.returnJsonArray(returnData)]; } +} From 66a335054fa896fc45eceeab1877073f7a92172f Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 16:48:53 +0200 Subject: [PATCH 13/66] add dealnote functionality --- .../ActiveCampaign/ActiveCampaign.node.ts | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 37385bbe6..fee588168 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -1,5 +1,5 @@ import { - IExecuteFunctions, + IExecuteFunctions, getExecuteSingleFunctions, } from 'n8n-core'; import { IDataObject, @@ -906,6 +906,24 @@ export class ActiveCampaign implements INodeType { }, description: 'The ID of the deal note', }, + { + displayName: 'Deal note ID', + name: 'dealNoteId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'updateNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal note', + }, { displayName: 'Deal Note', name: 'dealNote', @@ -998,7 +1016,7 @@ export class ActiveCampaign implements INodeType { } else if (operation === 'getAll') { // ---------------------------------- - // persons:getAll + // contacts:getAll // ---------------------------------- requestMethod = 'GET'; @@ -1027,7 +1045,7 @@ export class ActiveCampaign implements INodeType { addAdditionalFields(body.contact as IDataObject, updateFields); } else { - throw new Error(`The operation ${operation} is not known`); + throw new Error(`The operation "${operation}" is not known`); } } else if (resource === 'deal') { if (operation === 'create') { @@ -1091,7 +1109,7 @@ export class ActiveCampaign implements INodeType { } else if (operation === 'getAll') { // ---------------------------------- - // persons:getAll + // deals:getAll // ---------------------------------- requestMethod = 'GET'; @@ -1103,8 +1121,36 @@ export class ActiveCampaign implements INodeType { dataKey = 'deals'; endpoint = `/api/3/deals`; + + } else if (operation === 'createNote') { + // ---------------------------------- + // deal:createNote + // ---------------------------------- + requestMethod = 'POST' + + body.note = { + note: this.getNodeParameter('createNote', i) as string, + } + + const dealId = this.getNodeParameter('dealId', i) as number; + endpoint = `/api/3/deals/${dealId}/notes`; + + } else if (operation === 'updateNote') { + // ---------------------------------- + // deal:updateNote + // ---------------------------------- + requestMethod = 'POST' + + body.note = { + note: this.getNodeParameter('updateNote', i) as string, + } + + const dealId = this.getNodeParameter('dealId', i) as number; + const dealNoteId = this.getNodeParameter('dealNoteId', i) as number; + endpoint = `/api/3/deals/${dealId}/notes/${dealNoteId}`; + } else { - throw new Error(`The operation ${operation} is not known`); + throw new Error(`The operation "${operation}" is not known`); } } else { throw new Error(`The resource "${resource}" is not known!`); From a09d6dfbf665817b189ae34c55856efd494abd0b Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 16:56:15 +0200 Subject: [PATCH 14/66] exclude unnecessary import --- packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index fee588168..c9490a250 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -1,5 +1,5 @@ import { - IExecuteFunctions, getExecuteSingleFunctions, + IExecuteFunctions, } from 'n8n-core'; import { IDataObject, From 12a0592896cfc6156644293d60894c1906cc2df6 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 16:57:26 +0200 Subject: [PATCH 15/66] exclude unnecessary import --- packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index c9490a250..b4e0913c8 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -12,7 +12,6 @@ import { activeCampaignApiRequest, activeCampaignApiRequestAllItems, } from './GenericFunctions'; -import { type } from 'os'; interface CustomProperty { name: string; From 78997ddeac4304f89ee067a66b508ba912251482 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 17:48:46 +0200 Subject: [PATCH 16/66] rename fields to how they appear in APi to prevent bug --- .../ActiveCampaign/ActiveCampaign.node.ts | 69 +++++++++---------- 1 file changed, 31 insertions(+), 38 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index b4e0913c8..3de65413e 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -37,17 +37,6 @@ function addAdditionalFields(body: IDataObject, additionalFields: IDataObject) { } } -/** - * Add one additional field to the body - * - * @param {IDataObject} body The body object to add the field to - * @param {IDataObject} additionalField The field to add - */ -function addAdditionalField(body: IDataObject, additionalField: string | number) { - body.additionalField = additionalField; -} - - export class ActiveCampaign implements INodeType { description: INodeTypeDescription = { displayName: 'ActiveCampaign', @@ -511,7 +500,7 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- { displayName: 'Title', - name: 'dealTitle', + name: 'title', type: 'string', default: '', required: true, @@ -529,7 +518,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Deal\'s contact ID', - name: 'dealContactId', + name: 'contact', type: 'number', default: 0, required: true, @@ -547,7 +536,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Deal value', - name: 'dealValue', + name: 'value', type: 'number', default: 0, required: true, @@ -565,7 +554,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Currency', - name: 'dealCurrency', + name: 'currency', type: 'string', default: '', required: true, @@ -600,42 +589,42 @@ export class ActiveCampaign implements INodeType { options: [ { displayName: 'Description', - name: 'dealDescription', + name: 'description', type: 'string', default: '', description: 'The description of the deal', }, { displayName: 'Deal group ID', - name: 'dealGroup', + name: 'group', type: 'string', default: '', description: 'The group ID of the deal', }, { displayName: 'Deal stage ID', - name: 'dealStage', + name: 'stage', type: 'string', default: '', description: 'The stage ID of the deal', }, { displayName: 'Deal owner ID', - name: 'dealOwner', + name: 'owner', type: 'string', default: '', description: 'The owner ID of the deal', }, { displayName: 'Deal percentage', - name: 'dealPercentage', + name: 'percent', type: 'number', default: 0, description: 'The percentage of the deal', }, { displayName: 'Deal status', - name: 'dealStatus', + name: 'status', type: 'number', default: 0, description: 'The status of the deal', @@ -676,7 +665,7 @@ export class ActiveCampaign implements INodeType { 'update', ], resource: [ - 'contact', + 'deal', ], }, }, @@ -684,70 +673,70 @@ export class ActiveCampaign implements INodeType { options: [ { displayName: 'Title', - name: 'dealTitle', + name: 'title', type: 'string', default: '', description: 'The title of the deal', }, { displayName: 'Deal\'s contact ID', - name: 'dealContactId', + name: 'contact', type: 'number', default: 0, description: 'The ID of the deal\'s contact', }, { displayName: 'Deal value', - name: 'dealValue', + name: 'value', type: 'number', default: 0, description: 'The value of the deal in cents', }, { displayName: 'Currency', - name: 'dealCurrency', + name: 'currency', type: 'string', default: '', description: 'The currency of the deal in 3-character ISO format', }, { displayName: 'Description', - name: 'dealDescription', + name: 'description', type: 'string', default: '', description: 'The description of the deal', }, { displayName: 'Deal group ID', - name: 'dealGroup', + name: 'group', type: 'string', default: '', description: 'The group ID of the deal', }, { displayName: 'Deal stage ID', - name: 'dealStage', + name: 'stage', type: 'string', default: '', description: 'The stage ID of the deal', }, { displayName: 'Deal owner ID', - name: 'dealOwner', + name: 'owner', type: 'string', default: '', description: 'The owner ID of the deal', }, { displayName: 'Deal percentage', - name: 'dealPercentage', + name: 'percent', type: 'number', default: 0, description: 'The percentage of the deal', }, { displayName: 'Deal status', - name: 'dealStatus', + name: 'status', type: 'number', default: 0, description: 'The status of the deal', @@ -1059,13 +1048,13 @@ export class ActiveCampaign implements INodeType { dataKey = 'deal'; body.deal = { - title: this.getNodeParameter('dealTitle', i) as string, - contact: this.getNodeParameter('dealContactId', i) as string, - value: this.getNodeParameter('dealValue', i) as number, + title: this.getNodeParameter('title', i) as string, + contact: this.getNodeParameter('contact', i) as string, + value: this.getNodeParameter('value', i) as number, } as IDataObject; - let currency = this.getNodeParameter('dealCurrency', i).toString().toLowerCase() as string - addAdditionalField(body.deal as IDataObject, currency) + let currency = this.getNodeParameter('currency', i).toString().toLowerCase() as string + addAdditionalFields(body.deal as IDataObject, { currency }) const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; addAdditionalFields(body.deal as IDataObject, additionalFields); @@ -1154,7 +1143,11 @@ export class ActiveCampaign implements INodeType { } else { throw new Error(`The resource "${resource}" is not known!`); } - + console.log(requestMethod) + console.log(endpoint) + console.log(body) + console.log(qs) + console.log(dataKey) let responseData; if (returnAll === true) { responseData = await activeCampaignApiRequestAllItems.call(this, requestMethod, endpoint, body, qs, dataKey); From 5b335c1578829155558b3e806cab8cbe14b2c6e2 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 18:18:33 +0200 Subject: [PATCH 17/66] fix dealNote bug --- .../nodes/ActiveCampaign/ActiveCampaign.node.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 3de65413e..d3ea171df 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -1115,10 +1115,12 @@ export class ActiveCampaign implements INodeType { // deal:createNote // ---------------------------------- requestMethod = 'POST' + console.log(operation) + console.log(this.getNodeParameter('dealNote', i) as string) body.note = { - note: this.getNodeParameter('createNote', i) as string, - } + note: this.getNodeParameter('dealNote', i) as string, + } as IDataObject const dealId = this.getNodeParameter('dealId', i) as number; endpoint = `/api/3/deals/${dealId}/notes`; @@ -1130,8 +1132,8 @@ export class ActiveCampaign implements INodeType { requestMethod = 'POST' body.note = { - note: this.getNodeParameter('updateNote', i) as string, - } + note: this.getNodeParameter('dealNote', i) as string, + } as IDataObject const dealId = this.getNodeParameter('dealId', i) as number; const dealNoteId = this.getNodeParameter('dealNoteId', i) as number; From ccfcd6fc688a782fa60564825fb4fad63494c9f3 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 18:23:34 +0200 Subject: [PATCH 18/66] fix deal noe update --- packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index d3ea171df..ec52246f1 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -1129,7 +1129,7 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- // deal:updateNote // ---------------------------------- - requestMethod = 'POST' + requestMethod = 'PUT' body.note = { note: this.getNodeParameter('dealNote', i) as string, From 9072f9212eaac2d9e2439d6b7f41aa7cc5674a73 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 18:26:43 +0200 Subject: [PATCH 19/66] remove console.logs --- .../nodes/ActiveCampaign/ActiveCampaign.node.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index ec52246f1..b6d3ebd19 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -1115,8 +1115,6 @@ export class ActiveCampaign implements INodeType { // deal:createNote // ---------------------------------- requestMethod = 'POST' - console.log(operation) - console.log(this.getNodeParameter('dealNote', i) as string) body.note = { note: this.getNodeParameter('dealNote', i) as string, @@ -1145,11 +1143,7 @@ export class ActiveCampaign implements INodeType { } else { throw new Error(`The resource "${resource}" is not known!`); } - console.log(requestMethod) - console.log(endpoint) - console.log(body) - console.log(qs) - console.log(dataKey) + let responseData; if (returnAll === true) { responseData = await activeCampaignApiRequestAllItems.call(this, requestMethod, endpoint, body, qs, dataKey); From 5dcb2a74f2748e881c763717b877e611aa06e3a9 Mon Sep 17 00:00:00 2001 From: quansenB Date: Fri, 25 Oct 2019 18:29:23 +0200 Subject: [PATCH 20/66] add .env to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 91e093160..0466b8369 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ package-lock.json yarn.lock google-generated-credentials.json _START_PACKAGE +.env From 6166e3955b512d8bcd1451b3056ad55b53345851 Mon Sep 17 00:00:00 2001 From: quansenB Date: Tue, 29 Oct 2019 00:14:04 +0100 Subject: [PATCH 21/66] add -vscode to gitignore --- .gitignore | 1 + package.json | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0466b8369..1b2f93c3f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ yarn.lock google-generated-credentials.json _START_PACKAGE .env +.vscode diff --git a/package.json b/package.json index b045830f5..b9d1ec33d 100644 --- a/package.json +++ b/package.json @@ -16,5 +16,9 @@ "lerna": "^3.13.1", "run-script-os": "^1.0.7" }, - "postcss": {} + "postcss": {}, + "dependencies": { + "n8n-node-dev": "^0.5.0", + "typescript": "^3.6.4" + } } From fbe78e4cb61803ee5d170c4ed14338700a14ed70 Mon Sep 17 00:00:00 2001 From: quansenB Date: Tue, 29 Oct 2019 00:15:28 +0100 Subject: [PATCH 22/66] revert package.json chanes in editor ui --- packages/editor-ui/package json debug | 1 - packages/editor-ui/package.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 packages/editor-ui/package json debug diff --git a/packages/editor-ui/package json debug b/packages/editor-ui/package json debug deleted file mode 100644 index dbfd27f67..000000000 --- a/packages/editor-ui/package json debug +++ /dev/null @@ -1 +0,0 @@ -//VUE_APP_URL_BASE_API=http://localhost:5678/ \ No newline at end of file diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 82534d8a8..4dd2fe001 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -17,7 +17,7 @@ "build": "vue-cli-service build", "dev": "npm run serve", "lint": "vue-cli-service lint", - "serve": "vue-cli-service serve", + "serve": "VUE_APP_URL_BASE_API=http://localhost:5678/ vue-cli-service serve", "test": "npm run test:unit", "tslint": "tslint -p tsconfig.json -c tslint.json", "test:e2e": "vue-cli-service test:e2e", From a8b3f383ef687e8728a384546efdd7f6c3868022 Mon Sep 17 00:00:00 2001 From: quansenB Date: Tue, 29 Oct 2019 00:19:02 +0100 Subject: [PATCH 23/66] revert unneeded changes for PR --- package.json | 6 +----- packages/editor-ui/package.json | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b9d1ec33d..b045830f5 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,5 @@ "lerna": "^3.13.1", "run-script-os": "^1.0.7" }, - "postcss": {}, - "dependencies": { - "n8n-node-dev": "^0.5.0", - "typescript": "^3.6.4" - } + "postcss": {} } diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 4dd2fe001..7047295fb 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -78,4 +78,4 @@ "vue-typed-mixins": "^0.1.0", "vuex": "^3.1.1" } -} \ No newline at end of file +} From 3d42a0f0e6bbb13462650c51103c3682beccfba2 Mon Sep 17 00:00:00 2001 From: quansenB Date: Tue, 29 Oct 2019 19:51:09 +0100 Subject: [PATCH 24/66] add currency dropdown --- .../ActiveCampaign/ActiveCampaign.node.ts | 12 +- .../nodes/ActiveCampaign/currencies.ts | 175 ++++++++++++++++++ 2 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 packages/nodes-base/nodes/ActiveCampaign/currencies.ts diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index b6d3ebd19..2cd6c27f9 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -1,11 +1,13 @@ import { IExecuteFunctions, } from 'n8n-core'; + import { IDataObject, INodeTypeDescription, INodeExecutionData, INodeType, + INodePropertyOptions, } from 'n8n-workflow'; import { @@ -13,6 +15,8 @@ import { activeCampaignApiRequestAllItems, } from './GenericFunctions'; +import { returnAllCurrencyOptions } from './currencies' + interface CustomProperty { name: string; value: string; @@ -555,8 +559,8 @@ export class ActiveCampaign implements INodeType { { displayName: 'Currency', name: 'currency', - type: 'string', - default: '', + type: 'options', + default: 'eur', required: true, displayOptions: { show: { @@ -568,6 +572,7 @@ export class ActiveCampaign implements INodeType { ], }, }, + options: returnAllCurrencyOptions(), description: 'The currency of the deal in 3-character ISO format', }, { @@ -695,7 +700,8 @@ export class ActiveCampaign implements INodeType { { displayName: 'Currency', name: 'currency', - type: 'string', + type: 'options', + options: returnAllCurrencyOptions(), default: '', description: 'The currency of the deal in 3-character ISO format', }, diff --git a/packages/nodes-base/nodes/ActiveCampaign/currencies.ts b/packages/nodes-base/nodes/ActiveCampaign/currencies.ts new file mode 100644 index 000000000..007f95fa9 --- /dev/null +++ b/packages/nodes-base/nodes/ActiveCampaign/currencies.ts @@ -0,0 +1,175 @@ +export function returnAllCurrencyOptions() { + return [ + { name: 'United States Dollar', value: 'usd' }, + { name: 'Euro', value: 'eur' }, + { name: 'Renminbi', value: 'cny' }, + { name: '--------', value: '' }, + { name: 'United Arab Emirates Dirham', value: 'aed' }, + { name: 'Afghan Afghani', value: 'afn' }, + { name: 'Albanian Lek', value: 'all' }, + { name: 'Armenian Dram', value: 'amd' }, + { name: 'Netherlands Antillean Guilder', value: 'ang' }, + { name: 'Angolan Kwanza', value: 'aoa' }, + { name: 'Argentine Peso', value: 'ars' }, + { name: 'Australian Dollar', value: 'aud' }, + { name: 'Aruban Florin', value: 'awg' }, + { name: 'Azerbaijani Manat', value: 'azn' }, + { name: 'Bosnia-Herzegovina Convertible Mark', value: 'bam' }, + { name: 'Barbadian Dollar', value: 'bbd' }, + { name: 'Bangladeshi Taka', value: 'bdt' }, + { name: 'Bulgarian Lev', value: 'bgn' }, + { name: 'Bahraini Dinar', value: 'bhd' }, + { name: 'Burundian Franc', value: 'bif' }, + { name: 'Bermudan Dollar', value: 'bmd' }, + { name: 'Brunei Dollar', value: 'bnd' }, + { name: 'Bolivian Boliviano', value: 'bob' }, + { name: 'Brazilian Real', value: 'brl' }, + { name: 'Bahamian Dollar', value: 'bsd' }, + { name: 'Bitcoin', value: 'btc' }, + { name: 'Bhutanese Ngultrum', value: 'btn' }, + { name: 'Botswanan Pula', value: 'bwp' }, + { name: 'Belarusian Ruble', value: 'byn' }, + { name: 'Belize Dollar', value: 'bzd' }, + { name: 'Canadian Dollar', value: 'cad' }, + { name: 'Congolese Franc', value: 'cdf' }, + { name: 'Swiss Franc', value: 'chf' }, + { name: 'Chilean Unit of Account (UF)', value: 'clf' }, + { name: 'Chilean Peso', value: 'clp' }, + { name: 'Chinese Yuan (Offshore)', value: 'cnh' }, + { name: 'Colombian Peso', value: 'cop' }, + { name: 'Costa Rican Colón', value: 'crc' }, + { name: 'Cuban Convertible Peso', value: 'cuc' }, + { name: 'Cuban Peso', value: 'cup' }, + { name: 'Cape Verdean Escudo', value: 'cve' }, + { name: 'Czech Republic Koruna', value: 'czk' }, + { name: 'Djiboutian Franc', value: 'djf' }, + { name: 'Danish Krone', value: 'dkk' }, + { name: 'Dominican Peso', value: 'dop' }, + { name: 'Algerian Dinar', value: 'dzd' }, + { name: 'Egyptian Pound', value: 'egp' }, + { name: 'Eritrean Nakfa', value: 'ern' }, + { name: 'Ethiopian Birr', value: 'etb' }, + { name: 'Fijian Dollar', value: 'fjd' }, + { name: 'Falkland Islands Pound', value: 'fkp' }, + { name: 'British Pound Sterling', value: 'gbp' }, + { name: 'Georgian Lari', value: 'gel' }, + { name: 'Guernsey Pound', value: 'ggp' }, + { name: 'Ghanaian Cedi', value: 'ghs' }, + { name: 'Gibraltar Pound', value: 'gip' }, + { name: 'Gambian Dalasi', value: 'gmd' }, + { name: 'Guinean Franc', value: 'gnf' }, + { name: 'Guatemalan Quetzal', value: 'gtq' }, + { name: 'Guyanaese Dollar', value: 'gyd' }, + { name: 'Hong Kong Dollar', value: 'hkd' }, + { name: 'Honduran Lempira', value: 'hnl' }, + { name: 'Croatian Kuna', value: 'hrk' }, + { name: 'Haitian Gourde', value: 'htg' }, + { name: 'Hungarian Forint', value: 'huf' }, + { name: 'Indonesian Rupiah', value: 'idr' }, + { name: 'Israeli New Sheqel', value: 'ils' }, + { name: 'Manx pound', value: 'imp' }, + { name: 'Indian Rupee', value: 'inr' }, + { name: 'Iraqi Dinar', value: 'iqd' }, + { name: 'Iranian Rial', value: 'irr' }, + { name: 'Icelandic Króna', value: 'isk' }, + { name: 'Jersey Pound', value: 'jep' }, + { name: 'Jamaican Dollar', value: 'jmd' }, + { name: 'Jordanian Dinar', value: 'jod' }, + { name: 'Japanese Yen', value: 'jpy' }, + { name: 'Kenyan Shilling', value: 'kes' }, + { name: 'Kyrgystani Som', value: 'kgs' }, + { name: 'Cambodian Riel', value: 'khr' }, + { name: 'Comorian Franc', value: 'kmf' }, + { name: 'North Korean Won', value: 'kpw' }, + { name: 'South Korean Won', value: 'krw' }, + { name: 'Kuwaiti Dinar', value: 'kwd' }, + { name: 'Cayman Islands Dollar', value: 'kyd' }, + { name: 'Kazakhstani Tenge', value: 'kzt' }, + { name: 'Laotian Kip', value: 'lak' }, + { name: 'Lebanese Pound', value: 'lbp' }, + { name: 'Sri Lankan Rupee', value: 'lkr' }, + { name: 'Liberian Dollar', value: 'lrd' }, + { name: 'Lesotho Loti', value: 'lsl' }, + { name: 'Libyan Dinar', value: 'lyd' }, + { name: 'Moroccan Dirham', value: 'mad' }, + { name: 'Moldovan Leu', value: 'mdl' }, + { name: 'Malagasy Ariary', value: 'mga' }, + { name: 'Macedonian Denar', value: 'mkd' }, + { name: 'Myanma Kyat', value: 'mmk' }, + { name: 'Mongolian Tugrik', value: 'mnt' }, + { name: 'Macanese Pataca', value: 'mop' }, + { name: 'Mauritanian Ouguiya (pre-2018)', value: 'mro' }, + { name: 'Mauritanian Ouguiya', value: 'mru' }, + { name: 'Mauritian Rupee', value: 'mur' }, + { name: 'Maldivian Rufiyaa', value: 'mvr' }, + { name: 'Malawian Kwacha', value: 'mwk' }, + { name: 'Mexican Peso', value: 'mxn' }, + { name: 'Malaysian Ringgit', value: 'myr' }, + { name: 'Mozambican Metical', value: 'mzn' }, + { name: 'Namibian Dollar', value: 'nad' }, + { name: 'Nigerian Naira', value: 'ngn' }, + { name: 'Nicaraguan Córdoba', value: 'nio' }, + { name: 'Norwegian Krone', value: 'nok' }, + { name: 'Nepalese Rupee', value: 'npr' }, + { name: 'New Zealand Dollar', value: 'nzd' }, + { name: 'Omani Rial', value: 'omr' }, + { name: 'Panamanian Balboa', value: 'pab' }, + { name: 'Peruvian Nuevo Sol', value: 'pen' }, + { name: 'Papua New Guinean Kina', value: 'pgk' }, + { name: 'Philippine Peso', value: 'php' }, + { name: 'Pakistani Rupee', value: 'pkr' }, + { name: 'Polish Zloty', value: 'pln' }, + { name: 'Paraguayan Guarani', value: 'pyg' }, + { name: 'Qatari Rial', value: 'qar' }, + { name: 'Romanian Leu', value: 'ron' }, + { name: 'Serbian Dinar', value: 'rsd' }, + { name: 'Russian Ruble', value: 'rub' }, + { name: 'Rwandan Franc', value: 'rwf' }, + { name: 'Saudi Riyal', value: 'sar' }, + { name: 'Solomon Islands Dollar', value: 'sbd' }, + { name: 'Seychellois Rupee', value: 'scr' }, + { name: 'Sudanese Pound', value: 'sdg' }, + { name: 'Swedish Krona', value: 'sek' }, + { name: 'Singapore Dollar', value: 'sgd' }, + { name: 'Saint Helena Pound', value: 'shp' }, + { name: 'Sierra Leonean Leone', value: 'sll' }, + { name: 'Somali Shilling', value: 'sos' }, + { name: 'Surinamese Dollar', value: 'srd' }, + { name: 'South Sudanese Pound', value: 'ssp' }, + { name: 'São Tomé and Príncipe Dobra (pre-2018)', value: 'std' }, + { name: 'São Tomé and Príncipe Dobra', value: 'stn' }, + { name: 'Salvadoran Colón', value: 'svc' }, + { name: 'Syrian Pound', value: 'syp' }, + { name: 'Swazi Lilangeni', value: 'szl' }, + { name: 'Thai Baht', value: 'thb' }, + { name: 'Tajikistani Somoni', value: 'tjs' }, + { name: 'Turkmenistani Manat', value: 'tmt' }, + { name: 'Tunisian Dinar', value: 'tnd' }, + { name: "Tongan Pa'anga", value: 'top' }, + { name: 'Turkish Lira', value: 'try' }, + { name: 'Trinidad and Tobago Dollar', value: 'ttd' }, + { name: 'New Taiwan Dollar', value: 'twd' }, + { name: 'Tanzanian Shilling', value: 'tzs' }, + { name: 'Ukrainian Hryvnia', value: 'uah' }, + { name: 'Ugandan Shilling', value: 'ugx' }, + { name: 'Uruguayan Peso', value: 'uyu' }, + { name: 'Uzbekistan Som', value: 'uzs' }, + { name: 'Venezuelan Bolívar Fuerte', value: 'vef' }, + { name: 'Vietnamese Dong', value: 'vnd' }, + { name: 'Vanuatu Vatu', value: 'vuv' }, + { name: 'Samoan Tala', value: 'wst' }, + { name: 'CFA Franc BEAC', value: 'xaf' }, + { name: 'Silver Ounce', value: 'xag' }, + { name: 'Gold Ounce', value: 'xau' }, + { name: 'East Caribbean Dollar', value: 'xcd' }, + { name: 'Special Drawing Rights', value: 'xdr' }, + { name: 'CFA Franc BCEAO', value: 'xof' }, + { name: 'Palladium Ounce', value: 'xpd' }, + { name: 'CFP Franc', value: 'xpf' }, + { name: 'Platinum Ounce', value: 'xpt' }, + { name: 'Yemeni Rial', value: 'yer' }, + { name: 'South African Rand', value: 'zar' }, + { name: 'Zambian Kwacha', value: 'zmw' }, + { name: 'Zimbabwean Dollar', value: 'zwl' } + ] +} \ No newline at end of file From 4cbbdda8c1a80a53e273fb04de8e41da01762afc Mon Sep 17 00:00:00 2001 From: quansenB Date: Tue, 29 Oct 2019 19:53:02 +0100 Subject: [PATCH 25/66] add eur as default at update deal --- packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 2cd6c27f9..7aeb933cb 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -702,7 +702,7 @@ export class ActiveCampaign implements INodeType { name: 'currency', type: 'options', options: returnAllCurrencyOptions(), - default: '', + default: 'eur', description: 'The currency of the deal in 3-character ISO format', }, { From 51a6b47985296d55e8d4eafaad56546ab9e7f8fa Mon Sep 17 00:00:00 2001 From: quansenB Date: Tue, 29 Oct 2019 20:08:23 +0100 Subject: [PATCH 26/66] display pipeline, owner and stage as default in create deal --- .../ActiveCampaign/ActiveCampaign.node.ts | 97 ++++++++++++++----- 1 file changed, 71 insertions(+), 26 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 7aeb933cb..6835a752a 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -575,6 +575,57 @@ export class ActiveCampaign implements INodeType { options: returnAllCurrencyOptions(), description: 'The currency of the deal in 3-character ISO format', }, + { + displayName: 'Deal pipeline ID', + name: 'pipeline', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The pipeline ID of the deal', + }, + { + displayName: 'Deal stage ID', + name: 'stage', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The stage ID of the deal', + }, + { + displayName: 'Deal owner ID', + name: 'owner', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The owner ID of the deal', + }, { displayName: 'Additional Fields', name: 'additionalFields', @@ -599,27 +650,7 @@ export class ActiveCampaign implements INodeType { default: '', description: 'The description of the deal', }, - { - displayName: 'Deal group ID', - name: 'group', - type: 'string', - default: '', - description: 'The group ID of the deal', - }, - { - displayName: 'Deal stage ID', - name: 'stage', - type: 'string', - default: '', - description: 'The stage ID of the deal', - }, - { - displayName: 'Deal owner ID', - name: 'owner', - type: 'string', - default: '', - description: 'The owner ID of the deal', - }, + { displayName: 'Deal percentage', name: 'percent', @@ -713,11 +744,11 @@ export class ActiveCampaign implements INodeType { description: 'The description of the deal', }, { - displayName: 'Deal group ID', - name: 'group', + displayName: 'Deal pipeline ID', + name: 'pipeline', type: 'string', default: '', - description: 'The group ID of the deal', + description: 'The pipeline ID of the deal', }, { displayName: 'Deal stage ID', @@ -1059,13 +1090,27 @@ export class ActiveCampaign implements INodeType { value: this.getNodeParameter('value', i) as number, } as IDataObject; - let currency = this.getNodeParameter('currency', i).toString().toLowerCase() as string + const group = this.getNodeParameter('pipeline', i) as string + if(group !== ''){ + addAdditionalFields(body.deal as IDataObject, { group }) + } + + const owner = this.getNodeParameter('owner', i) as string + if(owner !== ''){ + addAdditionalFields(body.deal as IDataObject, { owner }) + } + + const stage = this.getNodeParameter('stage', i) as string + if(stage !== ''){ + addAdditionalFields(body.deal as IDataObject, { stage }) + } + + const currency = this.getNodeParameter('currency', i) as string addAdditionalFields(body.deal as IDataObject, { currency }) const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; addAdditionalFields(body.deal as IDataObject, additionalFields); - } else if (operation === 'update') { // ---------------------------------- // deal:update From 2e56730fade0647d39dfe4b160dc4702e1c17f1f Mon Sep 17 00:00:00 2001 From: quansenB Date: Tue, 29 Oct 2019 23:45:20 +0100 Subject: [PATCH 27/66] delete left over deleteNote code and change defdault currencies --- .../ActiveCampaign/ActiveCampaign.node.ts | 18 +++++++++++------- .../nodes/ActiveCampaign/currencies.ts | 8 ++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 6835a752a..787f6767c 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -577,7 +577,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Deal pipeline ID', - name: 'pipeline', + name: 'owner', type: 'string', default: '', displayOptions: { @@ -650,7 +650,7 @@ export class ActiveCampaign implements INodeType { default: '', description: 'The description of the deal', }, - + { displayName: 'Deal percentage', name: 'percent', @@ -745,7 +745,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Deal pipeline ID', - name: 'pipeline', + name: 'owner', type: 'string', default: '', description: 'The pipeline ID of the deal', @@ -966,6 +966,7 @@ export class ActiveCampaign implements INodeType { }, description: 'The content of the deal note', }, + ], }; @@ -1090,18 +1091,18 @@ export class ActiveCampaign implements INodeType { value: this.getNodeParameter('value', i) as number, } as IDataObject; - const group = this.getNodeParameter('pipeline', i) as string - if(group !== ''){ + const group = this.getNodeParameter('owner', i) as string + if (group !== '') { addAdditionalFields(body.deal as IDataObject, { group }) } const owner = this.getNodeParameter('owner', i) as string - if(owner !== ''){ + if (owner !== '') { addAdditionalFields(body.deal as IDataObject, { owner }) } const stage = this.getNodeParameter('stage', i) as string - if(stage !== ''){ + if (stage !== '') { addAdditionalFields(body.deal as IDataObject, { stage }) } @@ -1188,9 +1189,11 @@ export class ActiveCampaign implements INodeType { const dealNoteId = this.getNodeParameter('dealNoteId', i) as number; endpoint = `/api/3/deals/${dealId}/notes/${dealNoteId}`; + } else { throw new Error(`The operation "${operation}" is not known`); } + } else { throw new Error(`The resource "${resource}" is not known!`); } @@ -1212,3 +1215,4 @@ export class ActiveCampaign implements INodeType { return [this.helpers.returnJsonArray(returnData)]; } } + diff --git a/packages/nodes-base/nodes/ActiveCampaign/currencies.ts b/packages/nodes-base/nodes/ActiveCampaign/currencies.ts index 007f95fa9..8ff4d48ad 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/currencies.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/currencies.ts @@ -1,7 +1,9 @@ export function returnAllCurrencyOptions() { - return [ - { name: 'United States Dollar', value: 'usd' }, + return [ { name: 'Euro', value: 'eur' }, + { name: 'United States Dollar', value: 'usd' }, + { name: 'British Pound Sterling', value: 'gbp' }, + { name: 'Swiss Franc', value: 'chf' }, { name: 'Renminbi', value: 'cny' }, { name: '--------', value: '' }, { name: 'United Arab Emirates Dirham', value: 'aed' }, @@ -32,7 +34,6 @@ export function returnAllCurrencyOptions() { { name: 'Belize Dollar', value: 'bzd' }, { name: 'Canadian Dollar', value: 'cad' }, { name: 'Congolese Franc', value: 'cdf' }, - { name: 'Swiss Franc', value: 'chf' }, { name: 'Chilean Unit of Account (UF)', value: 'clf' }, { name: 'Chilean Peso', value: 'clp' }, { name: 'Chinese Yuan (Offshore)', value: 'cnh' }, @@ -51,7 +52,6 @@ export function returnAllCurrencyOptions() { { name: 'Ethiopian Birr', value: 'etb' }, { name: 'Fijian Dollar', value: 'fjd' }, { name: 'Falkland Islands Pound', value: 'fkp' }, - { name: 'British Pound Sterling', value: 'gbp' }, { name: 'Georgian Lari', value: 'gel' }, { name: 'Guernsey Pound', value: 'ggp' }, { name: 'Ghanaian Cedi', value: 'ghs' }, From 46c737dcf259430bda5a9d820d0eb9df34737240 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sat, 2 Nov 2019 18:29:01 +0100 Subject: [PATCH 28/66] add all currencies --- .../nodes-base/nodes/utils/allCurrencies.ts | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 packages/nodes-base/nodes/utils/allCurrencies.ts diff --git a/packages/nodes-base/nodes/utils/allCurrencies.ts b/packages/nodes-base/nodes/utils/allCurrencies.ts new file mode 100644 index 000000000..3fd41695d --- /dev/null +++ b/packages/nodes-base/nodes/utils/allCurrencies.ts @@ -0,0 +1,173 @@ +[ + { name: 'Euro', value: 'eur' }, + { name: 'United States Dollar', value: 'usd' }, + { name: 'British Pound Sterling', value: 'gbp' }, + { name: 'Swiss Franc', value: 'chf' }, + { name: 'Renminbi', value: 'cny' }, + { name: '--------', value: '' }, + { name: 'United Arab Emirates Dirham', value: 'aed' }, + { name: 'Afghan Afghani', value: 'afn' }, + { name: 'Albanian Lek', value: 'all' }, + { name: 'Armenian Dram', value: 'amd' }, + { name: 'Netherlands Antillean Guilder', value: 'ang' }, + { name: 'Angolan Kwanza', value: 'aoa' }, + { name: 'Argentine Peso', value: 'ars' }, + { name: 'Australian Dollar', value: 'aud' }, + { name: 'Aruban Florin', value: 'awg' }, + { name: 'Azerbaijani Manat', value: 'azn' }, + { name: 'Bosnia-Herzegovina Convertible Mark', value: 'bam' }, + { name: 'Barbadian Dollar', value: 'bbd' }, + { name: 'Bangladeshi Taka', value: 'bdt' }, + { name: 'Bulgarian Lev', value: 'bgn' }, + { name: 'Bahraini Dinar', value: 'bhd' }, + { name: 'Burundian Franc', value: 'bif' }, + { name: 'Bermudan Dollar', value: 'bmd' }, + { name: 'Brunei Dollar', value: 'bnd' }, + { name: 'Bolivian Boliviano', value: 'bob' }, + { name: 'Brazilian Real', value: 'brl' }, + { name: 'Bahamian Dollar', value: 'bsd' }, + { name: 'Bitcoin', value: 'btc' }, + { name: 'Bhutanese Ngultrum', value: 'btn' }, + { name: 'Botswanan Pula', value: 'bwp' }, + { name: 'Belarusian Ruble', value: 'byn' }, + { name: 'Belize Dollar', value: 'bzd' }, + { name: 'Canadian Dollar', value: 'cad' }, + { name: 'Congolese Franc', value: 'cdf' }, + { name: 'Chilean Unit of Account (UF)', value: 'clf' }, + { name: 'Chilean Peso', value: 'clp' }, + { name: 'Chinese Yuan (Offshore)', value: 'cnh' }, + { name: 'Colombian Peso', value: 'cop' }, + { name: 'Costa Rican Colón', value: 'crc' }, + { name: 'Cuban Convertible Peso', value: 'cuc' }, + { name: 'Cuban Peso', value: 'cup' }, + { name: 'Cape Verdean Escudo', value: 'cve' }, + { name: 'Czech Republic Koruna', value: 'czk' }, + { name: 'Djiboutian Franc', value: 'djf' }, + { name: 'Danish Krone', value: 'dkk' }, + { name: 'Dominican Peso', value: 'dop' }, + { name: 'Algerian Dinar', value: 'dzd' }, + { name: 'Egyptian Pound', value: 'egp' }, + { name: 'Eritrean Nakfa', value: 'ern' }, + { name: 'Ethiopian Birr', value: 'etb' }, + { name: 'Fijian Dollar', value: 'fjd' }, + { name: 'Falkland Islands Pound', value: 'fkp' }, + { name: 'Georgian Lari', value: 'gel' }, + { name: 'Guernsey Pound', value: 'ggp' }, + { name: 'Ghanaian Cedi', value: 'ghs' }, + { name: 'Gibraltar Pound', value: 'gip' }, + { name: 'Gambian Dalasi', value: 'gmd' }, + { name: 'Guinean Franc', value: 'gnf' }, + { name: 'Guatemalan Quetzal', value: 'gtq' }, + { name: 'Guyanaese Dollar', value: 'gyd' }, + { name: 'Hong Kong Dollar', value: 'hkd' }, + { name: 'Honduran Lempira', value: 'hnl' }, + { name: 'Croatian Kuna', value: 'hrk' }, + { name: 'Haitian Gourde', value: 'htg' }, + { name: 'Hungarian Forint', value: 'huf' }, + { name: 'Indonesian Rupiah', value: 'idr' }, + { name: 'Israeli New Sheqel', value: 'ils' }, + { name: 'Manx pound', value: 'imp' }, + { name: 'Indian Rupee', value: 'inr' }, + { name: 'Iraqi Dinar', value: 'iqd' }, + { name: 'Iranian Rial', value: 'irr' }, + { name: 'Icelandic Króna', value: 'isk' }, + { name: 'Jersey Pound', value: 'jep' }, + { name: 'Jamaican Dollar', value: 'jmd' }, + { name: 'Jordanian Dinar', value: 'jod' }, + { name: 'Japanese Yen', value: 'jpy' }, + { name: 'Kenyan Shilling', value: 'kes' }, + { name: 'Kyrgystani Som', value: 'kgs' }, + { name: 'Cambodian Riel', value: 'khr' }, + { name: 'Comorian Franc', value: 'kmf' }, + { name: 'North Korean Won', value: 'kpw' }, + { name: 'South Korean Won', value: 'krw' }, + { name: 'Kuwaiti Dinar', value: 'kwd' }, + { name: 'Cayman Islands Dollar', value: 'kyd' }, + { name: 'Kazakhstani Tenge', value: 'kzt' }, + { name: 'Laotian Kip', value: 'lak' }, + { name: 'Lebanese Pound', value: 'lbp' }, + { name: 'Sri Lankan Rupee', value: 'lkr' }, + { name: 'Liberian Dollar', value: 'lrd' }, + { name: 'Lesotho Loti', value: 'lsl' }, + { name: 'Libyan Dinar', value: 'lyd' }, + { name: 'Moroccan Dirham', value: 'mad' }, + { name: 'Moldovan Leu', value: 'mdl' }, + { name: 'Malagasy Ariary', value: 'mga' }, + { name: 'Macedonian Denar', value: 'mkd' }, + { name: 'Myanma Kyat', value: 'mmk' }, + { name: 'Mongolian Tugrik', value: 'mnt' }, + { name: 'Macanese Pataca', value: 'mop' }, + { name: 'Mauritanian Ouguiya (pre-2018)', value: 'mro' }, + { name: 'Mauritanian Ouguiya', value: 'mru' }, + { name: 'Mauritian Rupee', value: 'mur' }, + { name: 'Maldivian Rufiyaa', value: 'mvr' }, + { name: 'Malawian Kwacha', value: 'mwk' }, + { name: 'Mexican Peso', value: 'mxn' }, + { name: 'Malaysian Ringgit', value: 'myr' }, + { name: 'Mozambican Metical', value: 'mzn' }, + { name: 'Namibian Dollar', value: 'nad' }, + { name: 'Nigerian Naira', value: 'ngn' }, + { name: 'Nicaraguan Córdoba', value: 'nio' }, + { name: 'Norwegian Krone', value: 'nok' }, + { name: 'Nepalese Rupee', value: 'npr' }, + { name: 'New Zealand Dollar', value: 'nzd' }, + { name: 'Omani Rial', value: 'omr' }, + { name: 'Panamanian Balboa', value: 'pab' }, + { name: 'Peruvian Nuevo Sol', value: 'pen' }, + { name: 'Papua New Guinean Kina', value: 'pgk' }, + { name: 'Philippine Peso', value: 'php' }, + { name: 'Pakistani Rupee', value: 'pkr' }, + { name: 'Polish Zloty', value: 'pln' }, + { name: 'Paraguayan Guarani', value: 'pyg' }, + { name: 'Qatari Rial', value: 'qar' }, + { name: 'Romanian Leu', value: 'ron' }, + { name: 'Serbian Dinar', value: 'rsd' }, + { name: 'Russian Ruble', value: 'rub' }, + { name: 'Rwandan Franc', value: 'rwf' }, + { name: 'Saudi Riyal', value: 'sar' }, + { name: 'Solomon Islands Dollar', value: 'sbd' }, + { name: 'Seychellois Rupee', value: 'scr' }, + { name: 'Sudanese Pound', value: 'sdg' }, + { name: 'Swedish Krona', value: 'sek' }, + { name: 'Singapore Dollar', value: 'sgd' }, + { name: 'Saint Helena Pound', value: 'shp' }, + { name: 'Sierra Leonean Leone', value: 'sll' }, + { name: 'Somali Shilling', value: 'sos' }, + { name: 'Surinamese Dollar', value: 'srd' }, + { name: 'South Sudanese Pound', value: 'ssp' }, + { name: 'São Tomé and Príncipe Dobra (pre-2018)', value: 'std' }, + { name: 'São Tomé and Príncipe Dobra', value: 'stn' }, + { name: 'Salvadoran Colón', value: 'svc' }, + { name: 'Syrian Pound', value: 'syp' }, + { name: 'Swazi Lilangeni', value: 'szl' }, + { name: 'Thai Baht', value: 'thb' }, + { name: 'Tajikistani Somoni', value: 'tjs' }, + { name: 'Turkmenistani Manat', value: 'tmt' }, + { name: 'Tunisian Dinar', value: 'tnd' }, + { name: "Tongan Pa'anga", value: 'top' }, + { name: 'Turkish Lira', value: 'try' }, + { name: 'Trinidad and Tobago Dollar', value: 'ttd' }, + { name: 'New Taiwan Dollar', value: 'twd' }, + { name: 'Tanzanian Shilling', value: 'tzs' }, + { name: 'Ukrainian Hryvnia', value: 'uah' }, + { name: 'Ugandan Shilling', value: 'ugx' }, + { name: 'Uruguayan Peso', value: 'uyu' }, + { name: 'Uzbekistan Som', value: 'uzs' }, + { name: 'Venezuelan Bolívar Fuerte', value: 'vef' }, + { name: 'Vietnamese Dong', value: 'vnd' }, + { name: 'Vanuatu Vatu', value: 'vuv' }, + { name: 'Samoan Tala', value: 'wst' }, + { name: 'CFA Franc BEAC', value: 'xaf' }, + { name: 'Silver Ounce', value: 'xag' }, + { name: 'Gold Ounce', value: 'xau' }, + { name: 'East Caribbean Dollar', value: 'xcd' }, + { name: 'Special Drawing Rights', value: 'xdr' }, + { name: 'CFA Franc BCEAO', value: 'xof' }, + { name: 'Palladium Ounce', value: 'xpd' }, + { name: 'CFP Franc', value: 'xpf' }, + { name: 'Platinum Ounce', value: 'xpt' }, + { name: 'Yemeni Rial', value: 'yer' }, + { name: 'South African Rand', value: 'zar' }, + { name: 'Zambian Kwacha', value: 'zmw' }, + { name: 'Zimbabwean Dollar', value: 'zwl' } +] \ No newline at end of file From 925586e54311df77e30673e82dc0ef76ba674784 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sat, 2 Nov 2019 19:48:29 +0100 Subject: [PATCH 29/66] add create ecommerce node description --- .../ActiveCampaign/ActiveCampaign.node.ts | 604 +++++++++++++++++- 1 file changed, 603 insertions(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 787f6767c..622d343d4 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -79,6 +79,10 @@ export class ActiveCampaign implements INodeType { { name: 'Deal', value: 'deal', + }, + { + name: "E-commerce order", + value: "ecommerceOrder" } ], default: 'contact', @@ -184,6 +188,48 @@ export class ActiveCampaign implements INodeType { description: 'The operation to perform.', }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'ecommerceOrder', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a order', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a order', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a order', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all orders', + }, + { + name: 'Update', + value: 'update', + description: 'Update a order', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, + // ---------------------------------- @@ -966,7 +1012,563 @@ export class ActiveCampaign implements INodeType { }, description: 'The content of the deal note', }, + + // ---------------------------------- + // ecommerceOrder + // ---------------------------------- + + // ---------------------------------- + // ecommerceOrder:create + // ---------------------------------- + { + displayName: 'External ID', + name: 'externalid', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', + }, + { + displayName: 'External checkout ID', + name: 'externalcheckoutid', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', + }, + { + displayName: 'Order source', + name: 'source', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The email address of the customer who placed the order.', + }, + { + displayName: 'Total price', + name: 'totalPrice', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Order currency', + name: 'currency', + type: 'options', + default: 'eur', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + options: returnAllCurrencyOptions(), + description: 'The currency of the order (3-digit ISO code, e.g., "USD").', + }, + { + displayName: 'Connection ID', + name: 'connectionid', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the connection from which this order originated.', + }, + { + displayName: 'Customer ID', + name: 'customerid', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the customer associated with this order.', + }, + { + displayName: 'Creation Date', + name: 'externalCreatedDate', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The date the order was placed.', + }, + { + displayName: 'Abandoning Date', + name: 'externalCreatedDate', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', + }, + { + displayName: 'Products', + name: 'orderProducts', + type: 'collection', + typeOptions: { + multipleValues: true, + multipleValueButtonText: 'Add product', + }, + displayOptions: { + show: { + operation: [ + 'create' + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + description: 'All ordered products', + placeholder: 'Add product', + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'The name of the product', + }, + { + displayName: 'Price', + name: 'price', + type: 'number', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: 0, + description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Product Quantity', + name: 'quantity', + type: 'number', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: 0, + description: 'The quantity ordered.', + }, + { + displayName: 'Product external ID', + name: 'externalid', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'The id of the product in the external service.', + }, + { + displayName: 'Product Category', + name: 'category', + type: 'string', + default: '', + description: 'The category of the product.', + }, + { + displayName: 'SKU', + name: 'sku', + type: 'string', + default: '', + description: 'The SKU for the product.', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the product.', + }, + { + displayName: 'Image URL', + name: 'imageUrl', + type: 'string', + default: '', + description: 'An Image URL that displays an image of the product.', + }, + { + displayName: 'Product URL', + name: 'productUrl', + type: 'string', + default: '', + description: 'A URL linking to the product in your store.', + }, + ], + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Shipping Amount', + name: 'shippingAmount', + type: 'number', + default: 0, + description: 'The total shipping amount for the order in cents .', + }, + + { + displayName: 'Tax Amount', + name: 'taxAmount', + type: 'number', + default: 0, + description: 'The total tax amount for the order in cents.', + }, + { + displayName: 'Discount Amount', + name: 'discountAmount', + type: 'number', + default: 0, + description: 'The total discount amount for the order in cents.', + }, + { + displayName: 'Order URL', + name: 'orderUrl', + type: 'string', + default: '', + description: 'The URL for the order in the external service.', + }, + { + displayName: 'External updated date', + name: 'externalUpdatedDate', + type: 'string', + default: '', + description: 'The date the order was updated.', + }, + { + displayName: 'Shipping Method', + name: 'shippingMethod', + type: 'string', + default: '', + description: 'The shipping method of the order.', + }, + { + displayName: 'Order Number', + name: 'orderNumber', + type: 'string', + default: '', + description: 'The order number. This can be different than the externalid.', + }, + + ] + }, + // ---------------------------------- + // ecommerceOrder:update + // ---------------------------------- + { + displayName: 'ecommerceOrder ID', + name: 'ecommerceOrderId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the ecommerceOrder to update.', + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + description: 'The fields to update.', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + description: 'The title of the ecommerceOrder', + }, + { + displayName: 'ecommerceOrder\'s contact ID', + name: 'contact', + type: 'number', + default: 0, + description: 'The ID of the ecommerceOrder\'s contact', + }, + { + displayName: 'ecommerceOrder value', + name: 'value', + type: 'number', + default: 0, + description: 'The value of the ecommerceOrder in cents', + }, + { + displayName: 'Currency', + name: 'currency', + type: 'options', + options: returnAllCurrencyOptions(), + default: 'eur', + description: 'The currency of the ecommerceOrder in 3-character ISO format', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the ecommerceOrder', + }, + { + displayName: 'ecommerceOrder pipeline ID', + name: 'owner', + type: 'string', + default: '', + description: 'The pipeline ID of the ecommerceOrder', + }, + { + displayName: 'ecommerceOrder stage ID', + name: 'stage', + type: 'string', + default: '', + description: 'The stage ID of the ecommerceOrder', + }, + { + displayName: 'ecommerceOrder owner ID', + name: 'owner', + type: 'string', + default: '', + description: 'The owner ID of the ecommerceOrder', + }, + { + displayName: 'ecommerceOrder percentage', + name: 'percent', + type: 'number', + default: 0, + description: 'The percentage of the ecommerceOrder', + }, + { + displayName: 'ecommerceOrder status', + name: 'status', + type: 'number', + default: 0, + description: 'The status of the ecommerceOrder', + }, + ] + }, + + // ---------------------------------- + // ecommerceOrder:delete + // ---------------------------------- + { + displayName: 'ecommerceOrder ID', + name: 'ecommerceOrderId', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The ID of the ecommerceOrder', + }, + + // ---------------------------------- + // ecommerceOrder:get + // ---------------------------------- + { + displayName: 'ecommerceOrder ID', + name: 'ecommerceOrderId', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The ID of the ecommerceOrder', + }, + + // ---------------------------------- + // ecommerceOrder:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrder', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, ], }; @@ -1193,7 +1795,7 @@ export class ActiveCampaign implements INodeType { } else { throw new Error(`The operation "${operation}" is not known`); } - + } else { throw new Error(`The resource "${resource}" is not known!`); } From a69426d6ba3aab2e0a10ef2c93ca10b40f0af4c3 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sat, 2 Nov 2019 21:49:45 +0100 Subject: [PATCH 30/66] add rest of ecommerce description --- .../ActiveCampaign/ActiveCampaign.node.ts | 272 +++++++++++++----- 1 file changed, 193 insertions(+), 79 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 622d343d4..ffb543566 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -1166,7 +1166,7 @@ export class ActiveCampaign implements INodeType { { displayName: 'Creation Date', name: 'externalCreatedDate', - type: 'string', + type: 'dateTime', default: '', required: true, displayOptions: { @@ -1183,8 +1183,8 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Abandoning Date', - name: 'externalCreatedDate', - type: 'string', + name: 'abandonedDate', + type: 'dateTime', default: '', displayOptions: { show: { @@ -1218,15 +1218,12 @@ export class ActiveCampaign implements INodeType { }, default: {}, description: 'All ordered products', - placeholder: 'Add product', + placeholder: 'Add product field', options: [ { displayName: 'Name', name: 'name', type: 'string', - typeOptions: { - alwaysOpenEditWindow: true, - }, default: '', description: 'The name of the product', }, @@ -1234,9 +1231,6 @@ export class ActiveCampaign implements INodeType { displayName: 'Price', name: 'price', type: 'number', - typeOptions: { - alwaysOpenEditWindow: true, - }, default: 0, description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', }, @@ -1244,9 +1238,6 @@ export class ActiveCampaign implements INodeType { displayName: 'Product Quantity', name: 'quantity', type: 'number', - typeOptions: { - alwaysOpenEditWindow: true, - }, default: 0, description: 'The quantity ordered.', }, @@ -1254,9 +1245,6 @@ export class ActiveCampaign implements INodeType { displayName: 'Product external ID', name: 'externalid', type: 'string', - typeOptions: { - alwaysOpenEditWindow: true, - }, default: '', description: 'The id of the product in the external service.', }, @@ -1346,7 +1334,7 @@ export class ActiveCampaign implements INodeType { { displayName: 'External updated date', name: 'externalUpdatedDate', - type: 'string', + type: 'dateTime', default: '', description: 'The date the order was updated.', }, @@ -1372,9 +1360,10 @@ export class ActiveCampaign implements INodeType { // ecommerceOrder:update // ---------------------------------- { - displayName: 'ecommerceOrder ID', - name: 'ecommerceOrderId', + displayName: 'Order ID', + name: 'orderId', type: 'number', + default: 0, displayOptions: { show: { operation: [ @@ -1385,15 +1374,13 @@ export class ActiveCampaign implements INodeType { ], }, }, - default: 0, - required: true, - description: 'ID of the ecommerceOrder to update.', + description: 'The id of the e-commerce order.', }, + { - displayName: 'Update Fields', - name: 'updateFields', + displayName: 'Add Field', + name: 'additionalFields', type: 'collection', - description: 'The fields to update.', placeholder: 'Add Field', displayOptions: { show: { @@ -1408,76 +1395,205 @@ export class ActiveCampaign implements INodeType { default: {}, options: [ { - displayName: 'Title', - name: 'title', + displayName: 'External ID', + name: 'externalid', type: 'string', default: '', - description: 'The title of the ecommerceOrder', + description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', }, { - displayName: 'ecommerceOrder\'s contact ID', - name: 'contact', + displayName: 'External checkout ID', + name: 'externalcheckoutid', + type: 'string', + default: '', + description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', + }, + { + displayName: 'Order source', + name: 'source', type: 'number', default: 0, - description: 'The ID of the ecommerceOrder\'s contact', + description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', }, { - displayName: 'ecommerceOrder value', - name: 'value', + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + description: 'The email address of the customer who placed the order.', + }, + { + displayName: 'Total price', + name: 'totalPrice', type: 'number', default: 0, - description: 'The value of the ecommerceOrder in cents', + description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', }, { - displayName: 'Currency', + displayName: 'Order currency', name: 'currency', type: 'options', - options: returnAllCurrencyOptions(), default: 'eur', - description: 'The currency of the ecommerceOrder in 3-character ISO format', + options: returnAllCurrencyOptions(), + description: 'The currency of the order (3-digit ISO code, e.g., "USD").', }, { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the ecommerceOrder', - }, - { - displayName: 'ecommerceOrder pipeline ID', - name: 'owner', - type: 'string', - default: '', - description: 'The pipeline ID of the ecommerceOrder', - }, - { - displayName: 'ecommerceOrder stage ID', - name: 'stage', - type: 'string', - default: '', - description: 'The stage ID of the ecommerceOrder', - }, - { - displayName: 'ecommerceOrder owner ID', - name: 'owner', - type: 'string', - default: '', - description: 'The owner ID of the ecommerceOrder', - }, - { - displayName: 'ecommerceOrder percentage', - name: 'percent', + displayName: 'Connection ID', + name: 'connectionid', type: 'number', default: 0, - description: 'The percentage of the ecommerceOrder', + description: 'The id of the connection from which this order originated.', }, { - displayName: 'ecommerceOrder status', - name: 'status', + displayName: 'Customer ID', + name: 'customerid', type: 'number', default: 0, - description: 'The status of the ecommerceOrder', + description: 'The id of the customer associated with this order.', }, + { + displayName: 'Creation Date', + name: 'externalupdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was placed.', + }, + { + displayName: 'Abandoning Date', + name: 'abandonedDate', + type: 'dateTime', + default: '', + description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', + }, + { + displayName: 'Shipping Amount', + name: 'shippingAmount', + type: 'number', + default: 0, + description: 'The total shipping amount for the order in cents .', + }, + + { + displayName: 'Tax Amount', + name: 'taxAmount', + type: 'number', + default: 0, + description: 'The total tax amount for the order in cents.', + }, + { + displayName: 'Discount Amount', + name: 'discountAmount', + type: 'number', + default: 0, + description: 'The total discount amount for the order in cents.', + }, + { + displayName: 'Order URL', + name: 'orderUrl', + type: 'string', + default: '', + description: 'The URL for the order in the external service.', + }, + { + displayName: 'External updated date', + name: 'externalUpdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was updated.', + }, + { + displayName: 'Shipping Method', + name: 'shippingMethod', + type: 'string', + default: '', + description: 'The shipping method of the order.', + }, + { + displayName: 'Order Number', + name: 'orderNumber', + type: 'string', + default: '', + description: 'The order number. This can be different than the externalid.', + }, + + { + displayName: 'Products', + name: 'orderProducts', + type: 'collection', + typeOptions: { + multipleValues: true, + multipleValueButtonText: 'Add product', + }, + default: {}, + description: 'All ordered products', + placeholder: 'Add product field', + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'The name of the product', + }, + { + displayName: 'Price', + name: 'price', + type: 'number', + default: 0, + description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Product Quantity', + name: 'quantity', + type: 'number', + default: 0, + description: 'The quantity ordered.', + }, + { + displayName: 'Product external ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the product in the external service.', + }, + { + displayName: 'Product Category', + name: 'category', + type: 'string', + default: '', + description: 'The category of the product.', + }, + { + displayName: 'SKU', + name: 'sku', + type: 'string', + default: '', + description: 'The SKU for the product.', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the product.', + }, + { + displayName: 'Image URL', + name: 'imageUrl', + type: 'string', + default: '', + description: 'An Image URL that displays an image of the product.', + }, + { + displayName: 'Product URL', + name: 'productUrl', + type: 'string', + default: '', + description: 'A URL linking to the product in your store.', + }, + ], + }, + ] }, @@ -1485,11 +1601,10 @@ export class ActiveCampaign implements INodeType { // ecommerceOrder:delete // ---------------------------------- { - displayName: 'ecommerceOrder ID', - name: 'ecommerceOrderId', + displayName: 'Order ID', + name: 'orderId', type: 'number', default: 0, - required: true, displayOptions: { show: { operation: [ @@ -1500,18 +1615,17 @@ export class ActiveCampaign implements INodeType { ], }, }, - description: 'The ID of the ecommerceOrder', + description: 'The id of the e-commerce order.', }, // ---------------------------------- // ecommerceOrder:get // ---------------------------------- { - displayName: 'ecommerceOrder ID', - name: 'ecommerceOrderId', + displayName: 'Order ID', + name: 'orderId', type: 'number', default: 0, - required: true, displayOptions: { show: { operation: [ @@ -1522,7 +1636,7 @@ export class ActiveCampaign implements INodeType { ], }, }, - description: 'The ID of the ecommerceOrder', + description: 'The id of the e-commerce order.', }, // ---------------------------------- From 6bd391a35e0f85a130262b7c90bbccc4e776ea16 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sat, 2 Nov 2019 23:11:55 +0100 Subject: [PATCH 31/66] finish ecom order endpoints --- .../ActiveCampaign/ActiveCampaign.node.ts | 119 ++++++++++++++++-- .../nodes/ActiveCampaign/GenericFunctions.ts | 6 + 2 files changed, 113 insertions(+), 12 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index ffb543566..55fc88617 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -7,12 +7,12 @@ import { INodeTypeDescription, INodeExecutionData, INodeType, - INodePropertyOptions, } from 'n8n-workflow'; import { activeCampaignApiRequest, activeCampaignApiRequestAllItems, + IProduct, } from './GenericFunctions'; import { returnAllCurrencyOptions } from './currencies' @@ -623,7 +623,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Deal pipeline ID', - name: 'owner', + name: 'group', type: 'string', default: '', displayOptions: { @@ -791,7 +791,7 @@ export class ActiveCampaign implements INodeType { }, { displayName: 'Deal pipeline ID', - name: 'owner', + name: 'group', type: 'string', default: '', description: 'The pipeline ID of the deal', @@ -1355,7 +1355,7 @@ export class ActiveCampaign implements INodeType { ] }, - + // ---------------------------------- // ecommerceOrder:update // ---------------------------------- @@ -1376,10 +1376,10 @@ export class ActiveCampaign implements INodeType { }, description: 'The id of the e-commerce order.', }, - + { displayName: 'Add Field', - name: 'additionalFields', + name: 'updateFields', type: 'collection', placeholder: 'Add Field', displayOptions: { @@ -1515,7 +1515,7 @@ export class ActiveCampaign implements INodeType { default: '', description: 'The order number. This can be different than the externalid.', }, - + { displayName: 'Products', name: 'orderProducts', @@ -1682,7 +1682,7 @@ export class ActiveCampaign implements INodeType { }, default: 100, description: 'How many results to return.', - }, + }, ], }; @@ -1805,9 +1805,10 @@ export class ActiveCampaign implements INodeType { title: this.getNodeParameter('title', i) as string, contact: this.getNodeParameter('contact', i) as string, value: this.getNodeParameter('value', i) as number, + currency: this.getNodeParameter('currency', i) as string } as IDataObject; - const group = this.getNodeParameter('owner', i) as string + const group = this.getNodeParameter('group', i) as string if (group !== '') { addAdditionalFields(body.deal as IDataObject, { group }) } @@ -1822,9 +1823,6 @@ export class ActiveCampaign implements INodeType { addAdditionalFields(body.deal as IDataObject, { stage }) } - const currency = this.getNodeParameter('currency', i) as string - addAdditionalFields(body.deal as IDataObject, { currency }) - const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; addAdditionalFields(body.deal as IDataObject, additionalFields); @@ -1906,6 +1904,103 @@ export class ActiveCampaign implements INodeType { endpoint = `/api/3/deals/${dealId}/notes/${dealNoteId}`; + } else { + throw new Error(`The operation "${operation}" is not known`); + } + } else if (resource === 'ecommerceOrder') { + if (operation === 'create') { + // ---------------------------------- + // ecommerceOrder:create + // ---------------------------------- + + requestMethod = 'POST'; + + endpoint = '/api/3/ecomOrders'; + + dataKey = 'ecommerceOrder'; + + body.ecomOrder = { + source: this.getNodeParameter('source', i) as string, + email: this.getNodeParameter('email', i) as string, + totalPrice: this.getNodeParameter('totalPrice', i) as number, + currency: this.getNodeParameter('currency', i).toString().toUpperCase() as string, + externalCreatedDate: this.getNodeParameter('externalCreatedDate', i) as string, + connectionid: this.getNodeParameter('connectionid', i) as number, + customerid: this.getNodeParameter('customerid', i) as number, + } as IDataObject; + + const externalid = this.getNodeParameter('externalid', i) as string; + if (externalid !== '') { + addAdditionalFields(body.ecomOrder as IDataObject, { externalid }); + } + + const externalcheckoutid = this.getNodeParameter('externalcheckoutid', i) as string; + if (externalcheckoutid !== '') { + addAdditionalFields(body.ecomOrder as IDataObject, { externalcheckoutid }); + } + + const abandonedDate = this.getNodeParameter('abandonedDate', i) as string; + if (abandonedDate !== '') { + addAdditionalFields(body.ecomOrder as IDataObject, { abandonedDate }); + } + + const orderProducts = this.getNodeParameter('orderProducts', i) as unknown as IProduct[]; + addAdditionalFields(body.ecomOrder as IDataObject, { orderProducts }); + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + addAdditionalFields(body.ecomOrder as IDataObject, additionalFields); + + } else if (operation === 'update') { + // ---------------------------------- + // ecommerceOrder:update + // ---------------------------------- + + requestMethod = 'PUT'; + + const orderId = this.getNodeParameter('orderId', i) as number; + endpoint = `/api/3/ecomOrders/${orderId}`; + + dataKey = 'ecommerceOrder'; + body.ecomOrder = {} as IDataObject; + + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + addAdditionalFields(body.ecomOrder as IDataObject, updateFields); + + } else if (operation === 'delete') { + // ---------------------------------- + // ecommerceOrder:delete + // ---------------------------------- + + requestMethod = 'DELETE'; + + const orderId = this.getNodeParameter('orderId', i) as number; + endpoint = `/api/3/ecomOrders/${orderId}`; + + } else if (operation === 'get') { + // ---------------------------------- + // ecommerceOrder:get + // ---------------------------------- + + requestMethod = 'GET'; + + const orderId = this.getNodeParameter('orderId', i) as number; + endpoint = `/api/3/ecomOrders/${orderId}`; + + } else if (operation === 'getAll') { + // ---------------------------------- + // ecommerceOrders:getAll + // ---------------------------------- + + requestMethod = 'GET'; + + returnAll = this.getNodeParameter('returnAll', i) as boolean; + if (returnAll === false) { + qs.limit = this.getNodeParameter('limit', i) as number; + } + + dataKey = 'ecommerceOrders'; + endpoint = `/api/3/ecomOrders`; + } else { throw new Error(`The operation "${operation}" is not known`); } diff --git a/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts b/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts index 169c9f114..932f73e2c 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts @@ -9,6 +9,12 @@ import { import { OptionsWithUri } from 'request'; +export interface IProduct { + fields: { + item?: object[]; + }; +} + /** * Make an API request to ActiveCampaign From 09d00fc0d709a898e569003b14aabe0579c34727 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sun, 3 Nov 2019 12:47:36 +0100 Subject: [PATCH 32/66] refactor node description --- .../ActiveCampaign/ActiveCampaign.node.ts | 1600 +---------------- .../ActiveCampaign/ContactDescription.ts | 351 ++++ .../nodes/ActiveCampaign/DealDescription.ts | 529 ++++++ .../ActiveCampaign/EcomOrderDescription.ts | 719 ++++++++ .../nodes/ActiveCampaign/currencies.ts | 348 ++-- 5 files changed, 1792 insertions(+), 1755 deletions(-) create mode 100644 packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts create mode 100644 packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts create mode 100644 packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 55fc88617..127d06c45 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -15,7 +15,20 @@ import { IProduct, } from './GenericFunctions'; -import { returnAllCurrencyOptions } from './currencies' +import { + contactOperations, + contactFields +} from './ContactDescription'; + +import { + dealOperations, + dealFields +} from './DealDescription'; + +import { + ecomOrderOperations, + ecomOrderFields +} from './EcomOrderDescription'; interface CustomProperty { name: string; @@ -63,7 +76,6 @@ export class ActiveCampaign implements INodeType { } ], properties: [ - // ---------------------------------- // resources // ---------------------------------- @@ -89,1600 +101,28 @@ export class ActiveCampaign implements INodeType { description: 'The resource to operate on.', }, - - // ---------------------------------- // operations // ---------------------------------- - { - displayName: 'Operation', - name: 'operation', - type: 'options', - displayOptions: { - show: { - resource: [ - 'contact', - ], - }, - }, - options: [ - { - name: 'Create', - value: 'create', - description: 'Create a contact', - }, - { - name: 'Delete', - value: 'delete', - description: 'Delete a contact', - }, - { - name: 'Get', - value: 'get', - description: 'Get data of a contact', - }, - { - name: 'Get All', - value: 'getAll', - description: 'Get data of all contact', - }, - { - name: 'Update', - value: 'update', - description: 'Update a contact', - }, - ], - default: 'create', - description: 'The operation to perform.', - }, - - { - displayName: 'Operation', - name: 'operation', - type: 'options', - displayOptions: { - show: { - resource: [ - 'deal', - ], - }, - }, - options: [ - { - name: 'Create', - value: 'create', - description: 'Create a deal', - }, - { - name: 'Delete', - value: 'delete', - description: 'Delete a deal', - }, - { - name: 'Get', - value: 'get', - description: 'Get data of a deal', - }, - { - name: 'Get All', - value: 'getAll', - description: 'Get data of all deals', - }, - { - name: 'Update', - value: 'update', - description: 'Update a deal', - }, - { - name: 'Create Note', - value: 'createNote', - description: 'Create a deal note', - }, - { - name: 'Update deal note', - value: 'updateNote', - description: 'Update a deal note', - }, - ], - default: 'create', - description: 'The operation to perform.', - }, - - { - displayName: 'Operation', - name: 'operation', - type: 'options', - displayOptions: { - show: { - resource: [ - 'ecommerceOrder', - ], - }, - }, - options: [ - { - name: 'Create', - value: 'create', - description: 'Create a order', - }, - { - name: 'Delete', - value: 'delete', - description: 'Delete a order', - }, - { - name: 'Get', - value: 'get', - description: 'Get data of a order', - }, - { - name: 'Get All', - value: 'getAll', - description: 'Get data of all orders', - }, - { - name: 'Update', - value: 'update', - description: 'Update a order', - }, - ], - default: 'create', - description: 'The operation to perform.', - }, - - + ...contactOperations, + ...dealOperations, + ...ecomOrderOperations, // ---------------------------------- // contact // ---------------------------------- - - // ---------------------------------- - // contact:create - // ---------------------------------- - { - displayName: 'Email', - name: 'email', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'contact', - ], - }, - }, - description: 'The email of the contact to create', - }, - { - displayName: 'Update if exists', - name: 'updateIfExists', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'contact', - ], - }, - }, - default: false, - description: 'Update user if it exists already. If not set and user exists it will error instead.', - }, - { - displayName: 'Additional Fields', - name: 'additionalFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'contact', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'First Name', - name: 'firstName', - type: 'string', - default: '', - description: 'The first name of the contact to create', - }, - { - displayName: 'Last Name', - name: 'lastName', - type: 'string', - default: '', - description: 'The last name of the contact to create', - }, - { - displayName: 'Phone', - name: 'phone', - type: 'string', - default: '', - description: 'Phone number of the contact.', - }, - { - displayName: 'Custom Properties', - name: 'customProperties', - placeholder: 'Add Custom Property', - description: 'Adds a custom property to set also values which have not been predefined.', - type: 'fixedCollection', - typeOptions: { - multipleValues: true, - }, - default: {}, - options: [ - { - name: 'property', - displayName: 'Property', - values: [ - { - displayName: 'Property Name', - name: 'name', - type: 'string', - default: '', - description: 'Name of the property to set.', - }, - { - displayName: 'Property Value', - name: 'value', - type: 'string', - default: '', - description: 'Value of the property to set.', - }, - ] - }, - ], - }, - ], - }, - - // ---------------------------------- - // contact:update - // ---------------------------------- - { - displayName: 'Contact ID', - name: 'contactId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'contact', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the contact to update.', - }, - { - displayName: 'Update Fields', - name: 'updateFields', - type: 'collection', - description: 'The fields to update.', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'contact', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Email', - name: 'email', - type: 'string', - default: '', - description: 'Email of the contact.', - }, - { - displayName: 'First Name', - name: 'firstName', - type: 'string', - default: '', - description: 'First name of the contact', - }, - { - displayName: 'Last Name', - name: 'lastName', - type: 'string', - default: '', - description: 'Last name of the contact', - }, - { - displayName: 'Phone', - name: 'phone', - type: 'string', - default: '', - description: 'Phone number of the contact.', - }, - { - displayName: 'Custom Properties', - name: 'customProperties', - placeholder: 'Add Custom Property', - description: 'Adds a custom property to set also values which have not been predefined.', - type: 'fixedCollection', - typeOptions: { - multipleValues: true, - }, - default: {}, - options: [ - { - name: 'property', - displayName: 'Property', - values: [ - { - displayName: 'Property Name', - name: 'name', - type: 'string', - default: '', - description: 'Name of the property to set.', - }, - { - displayName: 'Property Value', - name: 'value', - type: 'string', - default: '', - description: 'Value of the property to set.', - }, - ] - }, - ], - }, - ], - }, - - // ---------------------------------- - // contact:delete - // ---------------------------------- - { - displayName: 'Contact ID', - name: 'contactId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'contact', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the contact to delete.', - }, - - // ---------------------------------- - // contact:get - // ---------------------------------- - { - displayName: 'Contact ID', - name: 'contactId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'contact', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the contact to get.', - }, - - // ---------------------------------- - // contact:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'contact', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'contact', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, - + ...contactFields, // ---------------------------------- // deal // ---------------------------------- - - // ---------------------------------- - // deal:create - // ---------------------------------- - { - displayName: 'Title', - name: 'title', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The title of the deal', - }, - { - displayName: 'Deal\'s contact ID', - name: 'contact', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal\'s contact', - }, - { - displayName: 'Deal value', - name: 'value', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The value of the deal in cents', - }, - { - displayName: 'Currency', - name: 'currency', - type: 'options', - default: 'eur', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - options: returnAllCurrencyOptions(), - description: 'The currency of the deal in 3-character ISO format', - }, - { - displayName: 'Deal pipeline ID', - name: 'group', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The pipeline ID of the deal', - }, - { - displayName: 'Deal stage ID', - name: 'stage', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The stage ID of the deal', - }, - { - displayName: 'Deal owner ID', - name: 'owner', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The owner ID of the deal', - }, - { - displayName: 'Additional Fields', - name: 'additionalFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the deal', - }, - - { - displayName: 'Deal percentage', - name: 'percent', - type: 'number', - default: 0, - description: 'The percentage of the deal', - }, - { - displayName: 'Deal status', - name: 'status', - type: 'number', - default: 0, - description: 'The status of the deal', - }, - ] - }, - - // ---------------------------------- - // deal:update - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'deal', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the deal to update.', - }, - { - displayName: 'Update Fields', - name: 'updateFields', - type: 'collection', - description: 'The fields to update.', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'deal', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Title', - name: 'title', - type: 'string', - default: '', - description: 'The title of the deal', - }, - { - displayName: 'Deal\'s contact ID', - name: 'contact', - type: 'number', - default: 0, - description: 'The ID of the deal\'s contact', - }, - { - displayName: 'Deal value', - name: 'value', - type: 'number', - default: 0, - description: 'The value of the deal in cents', - }, - { - displayName: 'Currency', - name: 'currency', - type: 'options', - options: returnAllCurrencyOptions(), - default: 'eur', - description: 'The currency of the deal in 3-character ISO format', - }, - { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the deal', - }, - { - displayName: 'Deal pipeline ID', - name: 'group', - type: 'string', - default: '', - description: 'The pipeline ID of the deal', - }, - { - displayName: 'Deal stage ID', - name: 'stage', - type: 'string', - default: '', - description: 'The stage ID of the deal', - }, - { - displayName: 'Deal owner ID', - name: 'owner', - type: 'string', - default: '', - description: 'The owner ID of the deal', - }, - { - displayName: 'Deal percentage', - name: 'percent', - type: 'number', - default: 0, - description: 'The percentage of the deal', - }, - { - displayName: 'Deal status', - name: 'status', - type: 'number', - default: 0, - description: 'The status of the deal', - }, - ] - }, - - // ---------------------------------- - // deal:delete - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal', - }, - - // ---------------------------------- - // deal:get - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal', - }, - - // ---------------------------------- - // deal:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'deal', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'deal', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, - - // ---------------------------------- - // dealNote:create - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'createNote', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal note', - }, - { - displayName: 'Deal Note', - name: 'dealNote', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'createNote', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The content of the deal note', - }, - - // ---------------------------------- - // dealNote:update - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'updateNote', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal note', - }, - { - displayName: 'Deal note ID', - name: 'dealNoteId', - type: 'number', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'updateNote', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal note', - }, - { - displayName: 'Deal Note', - name: 'dealNote', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'updateNote', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The content of the deal note', - }, + ...dealFields, // ---------------------------------- // ecommerceOrder // ---------------------------------- + ...ecomOrderFields, - // ---------------------------------- - // ecommerceOrder:create - // ---------------------------------- - { - displayName: 'External ID', - name: 'externalid', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', - }, - { - displayName: 'External checkout ID', - name: 'externalcheckoutid', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', - }, - { - displayName: 'Order source', - name: 'source', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', - }, - { - displayName: 'Customer Email', - name: 'email', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The email address of the customer who placed the order.', - }, - { - displayName: 'Total price', - name: 'totalPrice', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Order currency', - name: 'currency', - type: 'options', - default: 'eur', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - options: returnAllCurrencyOptions(), - description: 'The currency of the order (3-digit ISO code, e.g., "USD").', - }, - { - displayName: 'Connection ID', - name: 'connectionid', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the connection from which this order originated.', - }, - { - displayName: 'Customer ID', - name: 'customerid', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the customer associated with this order.', - }, - { - displayName: 'Creation Date', - name: 'externalCreatedDate', - type: 'dateTime', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The date the order was placed.', - }, - { - displayName: 'Abandoning Date', - name: 'abandonedDate', - type: 'dateTime', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', - }, - { - displayName: 'Products', - name: 'orderProducts', - type: 'collection', - typeOptions: { - multipleValues: true, - multipleValueButtonText: 'Add product', - }, - displayOptions: { - show: { - operation: [ - 'create' - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: {}, - description: 'All ordered products', - placeholder: 'Add product field', - options: [ - { - displayName: 'Name', - name: 'name', - type: 'string', - default: '', - description: 'The name of the product', - }, - { - displayName: 'Price', - name: 'price', - type: 'number', - default: 0, - description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Product Quantity', - name: 'quantity', - type: 'number', - default: 0, - description: 'The quantity ordered.', - }, - { - displayName: 'Product external ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the product in the external service.', - }, - { - displayName: 'Product Category', - name: 'category', - type: 'string', - default: '', - description: 'The category of the product.', - }, - { - displayName: 'SKU', - name: 'sku', - type: 'string', - default: '', - description: 'The SKU for the product.', - }, - { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the product.', - }, - { - displayName: 'Image URL', - name: 'imageUrl', - type: 'string', - default: '', - description: 'An Image URL that displays an image of the product.', - }, - { - displayName: 'Product URL', - name: 'productUrl', - type: 'string', - default: '', - description: 'A URL linking to the product in your store.', - }, - ], - }, - { - displayName: 'Additional Fields', - name: 'additionalFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Shipping Amount', - name: 'shippingAmount', - type: 'number', - default: 0, - description: 'The total shipping amount for the order in cents .', - }, - - { - displayName: 'Tax Amount', - name: 'taxAmount', - type: 'number', - default: 0, - description: 'The total tax amount for the order in cents.', - }, - { - displayName: 'Discount Amount', - name: 'discountAmount', - type: 'number', - default: 0, - description: 'The total discount amount for the order in cents.', - }, - { - displayName: 'Order URL', - name: 'orderUrl', - type: 'string', - default: '', - description: 'The URL for the order in the external service.', - }, - { - displayName: 'External updated date', - name: 'externalUpdatedDate', - type: 'dateTime', - default: '', - description: 'The date the order was updated.', - }, - { - displayName: 'Shipping Method', - name: 'shippingMethod', - type: 'string', - default: '', - description: 'The shipping method of the order.', - }, - { - displayName: 'Order Number', - name: 'orderNumber', - type: 'string', - default: '', - description: 'The order number. This can be different than the externalid.', - }, - - ] - }, - - // ---------------------------------- - // ecommerceOrder:update - // ---------------------------------- - { - displayName: 'Order ID', - name: 'orderId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the e-commerce order.', - }, - - { - displayName: 'Add Field', - name: 'updateFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'External ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', - }, - { - displayName: 'External checkout ID', - name: 'externalcheckoutid', - type: 'string', - default: '', - description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', - }, - { - displayName: 'Order source', - name: 'source', - type: 'number', - default: 0, - description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', - }, - { - displayName: 'Customer Email', - name: 'email', - type: 'string', - default: '', - description: 'The email address of the customer who placed the order.', - }, - { - displayName: 'Total price', - name: 'totalPrice', - type: 'number', - default: 0, - description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Order currency', - name: 'currency', - type: 'options', - default: 'eur', - options: returnAllCurrencyOptions(), - description: 'The currency of the order (3-digit ISO code, e.g., "USD").', - }, - { - displayName: 'Connection ID', - name: 'connectionid', - type: 'number', - default: 0, - description: 'The id of the connection from which this order originated.', - }, - { - displayName: 'Customer ID', - name: 'customerid', - type: 'number', - default: 0, - description: 'The id of the customer associated with this order.', - }, - { - displayName: 'Creation Date', - name: 'externalupdatedDate', - type: 'dateTime', - default: '', - description: 'The date the order was placed.', - }, - { - displayName: 'Abandoning Date', - name: 'abandonedDate', - type: 'dateTime', - default: '', - description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', - }, - { - displayName: 'Shipping Amount', - name: 'shippingAmount', - type: 'number', - default: 0, - description: 'The total shipping amount for the order in cents .', - }, - - { - displayName: 'Tax Amount', - name: 'taxAmount', - type: 'number', - default: 0, - description: 'The total tax amount for the order in cents.', - }, - { - displayName: 'Discount Amount', - name: 'discountAmount', - type: 'number', - default: 0, - description: 'The total discount amount for the order in cents.', - }, - { - displayName: 'Order URL', - name: 'orderUrl', - type: 'string', - default: '', - description: 'The URL for the order in the external service.', - }, - { - displayName: 'External updated date', - name: 'externalUpdatedDate', - type: 'dateTime', - default: '', - description: 'The date the order was updated.', - }, - { - displayName: 'Shipping Method', - name: 'shippingMethod', - type: 'string', - default: '', - description: 'The shipping method of the order.', - }, - { - displayName: 'Order Number', - name: 'orderNumber', - type: 'string', - default: '', - description: 'The order number. This can be different than the externalid.', - }, - - { - displayName: 'Products', - name: 'orderProducts', - type: 'collection', - typeOptions: { - multipleValues: true, - multipleValueButtonText: 'Add product', - }, - default: {}, - description: 'All ordered products', - placeholder: 'Add product field', - options: [ - { - displayName: 'Name', - name: 'name', - type: 'string', - default: '', - description: 'The name of the product', - }, - { - displayName: 'Price', - name: 'price', - type: 'number', - default: 0, - description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Product Quantity', - name: 'quantity', - type: 'number', - default: 0, - description: 'The quantity ordered.', - }, - { - displayName: 'Product external ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the product in the external service.', - }, - { - displayName: 'Product Category', - name: 'category', - type: 'string', - default: '', - description: 'The category of the product.', - }, - { - displayName: 'SKU', - name: 'sku', - type: 'string', - default: '', - description: 'The SKU for the product.', - }, - { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the product.', - }, - { - displayName: 'Image URL', - name: 'imageUrl', - type: 'string', - default: '', - description: 'An Image URL that displays an image of the product.', - }, - { - displayName: 'Product URL', - name: 'productUrl', - type: 'string', - default: '', - description: 'A URL linking to the product in your store.', - }, - ], - }, - - ] - }, - - // ---------------------------------- - // ecommerceOrder:delete - // ---------------------------------- - { - displayName: 'Order ID', - name: 'orderId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the e-commerce order.', - }, - - // ---------------------------------- - // ecommerceOrder:get - // ---------------------------------- - { - displayName: 'Order ID', - name: 'orderId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the e-commerce order.', - }, - - // ---------------------------------- - // ecommerceOrder:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'ecommerceOrder', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, ], }; diff --git a/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts new file mode 100644 index 000000000..b44482450 --- /dev/null +++ b/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts @@ -0,0 +1,351 @@ +import { INodeProperties } from "n8n-workflow"; + +export const contactOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'contact', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a contact', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a contact', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a contact', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all contact', + }, + { + name: 'Update', + value: 'update', + description: 'Update a contact', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, +] as INodeProperties[] + +export const contactFields = [ + // ---------------------------------- + // contact:create + // ---------------------------------- + { + displayName: 'Email', + name: 'email', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'contact', + ], + }, + }, + description: 'The email of the contact to create', + }, + { + displayName: 'Update if exists', + name: 'updateIfExists', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'contact', + ], + }, + }, + default: false, + description: 'Update user if it exists already. If not set and user exists it will error instead.', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'contact', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'First Name', + name: 'firstName', + type: 'string', + default: '', + description: 'The first name of the contact to create', + }, + { + displayName: 'Last Name', + name: 'lastName', + type: 'string', + default: '', + description: 'The last name of the contact to create', + }, + { + displayName: 'Phone', + name: 'phone', + type: 'string', + default: '', + description: 'Phone number of the contact.', + }, + { + displayName: 'Custom Properties', + name: 'customProperties', + placeholder: 'Add Custom Property', + description: 'Adds a custom property to set also values which have not been predefined.', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + name: 'property', + displayName: 'Property', + values: [ + { + displayName: 'Property Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the property to set.', + }, + { + displayName: 'Property Value', + name: 'value', + type: 'string', + default: '', + description: 'Value of the property to set.', + }, + ] + }, + ], + }, + ], + }, + + // ---------------------------------- + // contact:update + // ---------------------------------- + { + displayName: 'Contact ID', + name: 'contactId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'contact', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the contact to update.', + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + description: 'The fields to update.', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'contact', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Email', + name: 'email', + type: 'string', + default: '', + description: 'Email of the contact.', + }, + { + displayName: 'First Name', + name: 'firstName', + type: 'string', + default: '', + description: 'First name of the contact', + }, + { + displayName: 'Last Name', + name: 'lastName', + type: 'string', + default: '', + description: 'Last name of the contact', + }, + { + displayName: 'Phone', + name: 'phone', + type: 'string', + default: '', + description: 'Phone number of the contact.', + }, + { + displayName: 'Custom Properties', + name: 'customProperties', + placeholder: 'Add Custom Property', + description: 'Adds a custom property to set also values which have not been predefined.', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + name: 'property', + displayName: 'Property', + values: [ + { + displayName: 'Property Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the property to set.', + }, + { + displayName: 'Property Value', + name: 'value', + type: 'string', + default: '', + description: 'Value of the property to set.', + }, + ] + }, + ], + }, + ], + }, + + // ---------------------------------- + // contact:delete + // ---------------------------------- + { + displayName: 'Contact ID', + name: 'contactId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'contact', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the contact to delete.', + }, + + // ---------------------------------- + // contact:get + // ---------------------------------- + { + displayName: 'Contact ID', + name: 'contactId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'contact', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the contact to get.', + }, + + // ---------------------------------- + // contact:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contact', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contact', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, +] as INodeProperties[] diff --git a/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts new file mode 100644 index 000000000..03ffc386d --- /dev/null +++ b/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts @@ -0,0 +1,529 @@ +import { INodeProperties } from "n8n-workflow"; + +import { allCurrencies } from './currencies'; + +export const dealOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'deal', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a deal', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a deal', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a deal', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all deals', + }, + { + name: 'Update', + value: 'update', + description: 'Update a deal', + }, + { + name: 'Create Note', + value: 'createNote', + description: 'Create a deal note', + }, + { + name: 'Update deal note', + value: 'updateNote', + description: 'Update a deal note', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, + +] as INodeProperties[] + +export const dealFields = [ + // ---------------------------------- + // deal:create + // ---------------------------------- + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The title of the deal', + }, + { + displayName: 'Deal\'s contact ID', + name: 'contact', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal\'s contact', + }, + { + displayName: 'Deal value', + name: 'value', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The value of the deal in cents', + }, + { + displayName: 'Currency', + name: 'currency', + type: 'options', + default: 'eur', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + options: allCurrencies, + description: 'The currency of the deal in 3-character ISO format', + }, + { + displayName: 'Deal pipeline ID', + name: 'group', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The pipeline ID of the deal', + }, + { + displayName: 'Deal stage ID', + name: 'stage', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The stage ID of the deal', + }, + { + displayName: 'Deal owner ID', + name: 'owner', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The owner ID of the deal', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the deal', + }, + + { + displayName: 'Deal percentage', + name: 'percent', + type: 'number', + default: 0, + description: 'The percentage of the deal', + }, + { + displayName: 'Deal status', + name: 'status', + type: 'number', + default: 0, + description: 'The status of the deal', + }, + ] + }, + + // ---------------------------------- + // deal:update + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the deal to update.', + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + description: 'The fields to update.', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + description: 'The title of the deal', + }, + { + displayName: 'Deal\'s contact ID', + name: 'contact', + type: 'number', + default: 0, + description: 'The ID of the deal\'s contact', + }, + { + displayName: 'Deal value', + name: 'value', + type: 'number', + default: 0, + description: 'The value of the deal in cents', + }, + { + displayName: 'Currency', + name: 'currency', + type: 'options', + options: allCurrencies, + default: 'eur', + description: 'The currency of the deal in 3-character ISO format', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the deal', + }, + { + displayName: 'Deal pipeline ID', + name: 'group', + type: 'string', + default: '', + description: 'The pipeline ID of the deal', + }, + { + displayName: 'Deal stage ID', + name: 'stage', + type: 'string', + default: '', + description: 'The stage ID of the deal', + }, + { + displayName: 'Deal owner ID', + name: 'owner', + type: 'string', + default: '', + description: 'The owner ID of the deal', + }, + { + displayName: 'Deal percentage', + name: 'percent', + type: 'number', + default: 0, + description: 'The percentage of the deal', + }, + { + displayName: 'Deal status', + name: 'status', + type: 'number', + default: 0, + description: 'The status of the deal', + }, + ] + }, + + // ---------------------------------- + // deal:delete + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal', + }, + + // ---------------------------------- + // deal:get + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal', + }, + + // ---------------------------------- + // deal:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'deal', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'deal', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, + + // ---------------------------------- + // dealNote:create + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'createNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal note', + }, + { + displayName: 'Deal Note', + name: 'dealNote', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'createNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The content of the deal note', + }, + + // ---------------------------------- + // dealNote:update + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'updateNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal note', + }, + { + displayName: 'Deal note ID', + name: 'dealNoteId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'updateNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal note', + }, + { + displayName: 'Deal Note', + name: 'dealNote', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'updateNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The content of the deal note', + }, + +] as INodeProperties[] \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts new file mode 100644 index 000000000..846c5cd35 --- /dev/null +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts @@ -0,0 +1,719 @@ +import { INodeProperties } from "n8n-workflow"; + +import { allCurrencies } from './currencies'; + +export const ecomOrderOperations = [ + + + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'ecommerceOrder', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a order', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a order', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a order', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all orders', + }, + { + name: 'Update', + value: 'update', + description: 'Update a order', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, +] as INodeProperties[] + +export const ecomOrderFields = [ + + // ---------------------------------- + // ecommerceOrder:create + // ---------------------------------- + { + displayName: 'External ID', + name: 'externalid', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', + }, + { + displayName: 'External checkout ID', + name: 'externalcheckoutid', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', + }, + { + displayName: 'Order source', + name: 'source', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The email address of the customer who placed the order.', + }, + { + displayName: 'Total price', + name: 'totalPrice', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Order currency', + name: 'currency', + type: 'options', + default: 'eur', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + options: allCurrencies, + description: 'The currency of the order (3-digit ISO code, e.g., "USD").', + }, + { + displayName: 'Connection ID', + name: 'connectionid', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the connection from which this order originated.', + }, + { + displayName: 'Customer ID', + name: 'customerid', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the customer associated with this order.', + }, + { + displayName: 'Creation Date', + name: 'externalCreatedDate', + type: 'dateTime', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The date the order was placed.', + }, + { + displayName: 'Abandoning Date', + name: 'abandonedDate', + type: 'dateTime', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', + }, + { + displayName: 'Products', + name: 'orderProducts', + type: 'collection', + typeOptions: { + multipleValues: true, + multipleValueButtonText: 'Add product', + }, + displayOptions: { + show: { + operation: [ + 'create' + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + description: 'All ordered products', + placeholder: 'Add product field', + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'The name of the product', + }, + { + displayName: 'Price', + name: 'price', + type: 'number', + default: 0, + description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Product Quantity', + name: 'quantity', + type: 'number', + default: 0, + description: 'The quantity ordered.', + }, + { + displayName: 'Product external ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the product in the external service.', + }, + { + displayName: 'Product Category', + name: 'category', + type: 'string', + default: '', + description: 'The category of the product.', + }, + { + displayName: 'SKU', + name: 'sku', + type: 'string', + default: '', + description: 'The SKU for the product.', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the product.', + }, + { + displayName: 'Image URL', + name: 'imageUrl', + type: 'string', + default: '', + description: 'An Image URL that displays an image of the product.', + }, + { + displayName: 'Product URL', + name: 'productUrl', + type: 'string', + default: '', + description: 'A URL linking to the product in your store.', + }, + ], + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Shipping Amount', + name: 'shippingAmount', + type: 'number', + default: 0, + description: 'The total shipping amount for the order in cents .', + }, + + { + displayName: 'Tax Amount', + name: 'taxAmount', + type: 'number', + default: 0, + description: 'The total tax amount for the order in cents.', + }, + { + displayName: 'Discount Amount', + name: 'discountAmount', + type: 'number', + default: 0, + description: 'The total discount amount for the order in cents.', + }, + { + displayName: 'Order URL', + name: 'orderUrl', + type: 'string', + default: '', + description: 'The URL for the order in the external service.', + }, + { + displayName: 'External updated date', + name: 'externalUpdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was updated.', + }, + { + displayName: 'Shipping Method', + name: 'shippingMethod', + type: 'string', + default: '', + description: 'The shipping method of the order.', + }, + { + displayName: 'Order Number', + name: 'orderNumber', + type: 'string', + default: '', + description: 'The order number. This can be different than the externalid.', + }, + + ] + }, + + // ---------------------------------- + // ecommerceOrder:update + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, + + { + displayName: 'Add Field', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'External ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', + }, + { + displayName: 'External checkout ID', + name: 'externalcheckoutid', + type: 'string', + default: '', + description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', + }, + { + displayName: 'Order source', + name: 'source', + type: 'number', + default: 0, + description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + description: 'The email address of the customer who placed the order.', + }, + { + displayName: 'Total price', + name: 'totalPrice', + type: 'number', + default: 0, + description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Order currency', + name: 'currency', + type: 'options', + default: 'eur', + options: allCurrencies, + description: 'The currency of the order (3-digit ISO code, e.g., "USD").', + }, + { + displayName: 'Connection ID', + name: 'connectionid', + type: 'number', + default: 0, + description: 'The id of the connection from which this order originated.', + }, + { + displayName: 'Customer ID', + name: 'customerid', + type: 'number', + default: 0, + description: 'The id of the customer associated with this order.', + }, + { + displayName: 'Creation Date', + name: 'externalupdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was placed.', + }, + { + displayName: 'Abandoning Date', + name: 'abandonedDate', + type: 'dateTime', + default: '', + description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', + }, + { + displayName: 'Shipping Amount', + name: 'shippingAmount', + type: 'number', + default: 0, + description: 'The total shipping amount for the order in cents .', + }, + + { + displayName: 'Tax Amount', + name: 'taxAmount', + type: 'number', + default: 0, + description: 'The total tax amount for the order in cents.', + }, + { + displayName: 'Discount Amount', + name: 'discountAmount', + type: 'number', + default: 0, + description: 'The total discount amount for the order in cents.', + }, + { + displayName: 'Order URL', + name: 'orderUrl', + type: 'string', + default: '', + description: 'The URL for the order in the external service.', + }, + { + displayName: 'External updated date', + name: 'externalUpdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was updated.', + }, + { + displayName: 'Shipping Method', + name: 'shippingMethod', + type: 'string', + default: '', + description: 'The shipping method of the order.', + }, + { + displayName: 'Order Number', + name: 'orderNumber', + type: 'string', + default: '', + description: 'The order number. This can be different than the externalid.', + }, + + { + displayName: 'Products', + name: 'orderProducts', + type: 'collection', + typeOptions: { + multipleValues: true, + multipleValueButtonText: 'Add product', + }, + default: {}, + description: 'All ordered products', + placeholder: 'Add product field', + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'The name of the product', + }, + { + displayName: 'Price', + name: 'price', + type: 'number', + default: 0, + description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Product Quantity', + name: 'quantity', + type: 'number', + default: 0, + description: 'The quantity ordered.', + }, + { + displayName: 'Product external ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the product in the external service.', + }, + { + displayName: 'Product Category', + name: 'category', + type: 'string', + default: '', + description: 'The category of the product.', + }, + { + displayName: 'SKU', + name: 'sku', + type: 'string', + default: '', + description: 'The SKU for the product.', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the product.', + }, + { + displayName: 'Image URL', + name: 'imageUrl', + type: 'string', + default: '', + description: 'An Image URL that displays an image of the product.', + }, + { + displayName: 'Product URL', + name: 'productUrl', + type: 'string', + default: '', + description: 'A URL linking to the product in your store.', + }, + ], + }, + + ] + }, + + // ---------------------------------- + // ecommerceOrder:delete + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, + + // ---------------------------------- + // ecommerceOrder:get + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, + + // ---------------------------------- + // ecommerceOrder:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrder', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, +] as INodeProperties[] \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/currencies.ts b/packages/nodes-base/nodes/ActiveCampaign/currencies.ts index 8ff4d48ad..194864f72 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/currencies.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/currencies.ts @@ -1,175 +1,173 @@ -export function returnAllCurrencyOptions() { - return [ - { name: 'Euro', value: 'eur' }, - { name: 'United States Dollar', value: 'usd' }, - { name: 'British Pound Sterling', value: 'gbp' }, - { name: 'Swiss Franc', value: 'chf' }, - { name: 'Renminbi', value: 'cny' }, - { name: '--------', value: '' }, - { name: 'United Arab Emirates Dirham', value: 'aed' }, - { name: 'Afghan Afghani', value: 'afn' }, - { name: 'Albanian Lek', value: 'all' }, - { name: 'Armenian Dram', value: 'amd' }, - { name: 'Netherlands Antillean Guilder', value: 'ang' }, - { name: 'Angolan Kwanza', value: 'aoa' }, - { name: 'Argentine Peso', value: 'ars' }, - { name: 'Australian Dollar', value: 'aud' }, - { name: 'Aruban Florin', value: 'awg' }, - { name: 'Azerbaijani Manat', value: 'azn' }, - { name: 'Bosnia-Herzegovina Convertible Mark', value: 'bam' }, - { name: 'Barbadian Dollar', value: 'bbd' }, - { name: 'Bangladeshi Taka', value: 'bdt' }, - { name: 'Bulgarian Lev', value: 'bgn' }, - { name: 'Bahraini Dinar', value: 'bhd' }, - { name: 'Burundian Franc', value: 'bif' }, - { name: 'Bermudan Dollar', value: 'bmd' }, - { name: 'Brunei Dollar', value: 'bnd' }, - { name: 'Bolivian Boliviano', value: 'bob' }, - { name: 'Brazilian Real', value: 'brl' }, - { name: 'Bahamian Dollar', value: 'bsd' }, - { name: 'Bitcoin', value: 'btc' }, - { name: 'Bhutanese Ngultrum', value: 'btn' }, - { name: 'Botswanan Pula', value: 'bwp' }, - { name: 'Belarusian Ruble', value: 'byn' }, - { name: 'Belize Dollar', value: 'bzd' }, - { name: 'Canadian Dollar', value: 'cad' }, - { name: 'Congolese Franc', value: 'cdf' }, - { name: 'Chilean Unit of Account (UF)', value: 'clf' }, - { name: 'Chilean Peso', value: 'clp' }, - { name: 'Chinese Yuan (Offshore)', value: 'cnh' }, - { name: 'Colombian Peso', value: 'cop' }, - { name: 'Costa Rican Colón', value: 'crc' }, - { name: 'Cuban Convertible Peso', value: 'cuc' }, - { name: 'Cuban Peso', value: 'cup' }, - { name: 'Cape Verdean Escudo', value: 'cve' }, - { name: 'Czech Republic Koruna', value: 'czk' }, - { name: 'Djiboutian Franc', value: 'djf' }, - { name: 'Danish Krone', value: 'dkk' }, - { name: 'Dominican Peso', value: 'dop' }, - { name: 'Algerian Dinar', value: 'dzd' }, - { name: 'Egyptian Pound', value: 'egp' }, - { name: 'Eritrean Nakfa', value: 'ern' }, - { name: 'Ethiopian Birr', value: 'etb' }, - { name: 'Fijian Dollar', value: 'fjd' }, - { name: 'Falkland Islands Pound', value: 'fkp' }, - { name: 'Georgian Lari', value: 'gel' }, - { name: 'Guernsey Pound', value: 'ggp' }, - { name: 'Ghanaian Cedi', value: 'ghs' }, - { name: 'Gibraltar Pound', value: 'gip' }, - { name: 'Gambian Dalasi', value: 'gmd' }, - { name: 'Guinean Franc', value: 'gnf' }, - { name: 'Guatemalan Quetzal', value: 'gtq' }, - { name: 'Guyanaese Dollar', value: 'gyd' }, - { name: 'Hong Kong Dollar', value: 'hkd' }, - { name: 'Honduran Lempira', value: 'hnl' }, - { name: 'Croatian Kuna', value: 'hrk' }, - { name: 'Haitian Gourde', value: 'htg' }, - { name: 'Hungarian Forint', value: 'huf' }, - { name: 'Indonesian Rupiah', value: 'idr' }, - { name: 'Israeli New Sheqel', value: 'ils' }, - { name: 'Manx pound', value: 'imp' }, - { name: 'Indian Rupee', value: 'inr' }, - { name: 'Iraqi Dinar', value: 'iqd' }, - { name: 'Iranian Rial', value: 'irr' }, - { name: 'Icelandic Króna', value: 'isk' }, - { name: 'Jersey Pound', value: 'jep' }, - { name: 'Jamaican Dollar', value: 'jmd' }, - { name: 'Jordanian Dinar', value: 'jod' }, - { name: 'Japanese Yen', value: 'jpy' }, - { name: 'Kenyan Shilling', value: 'kes' }, - { name: 'Kyrgystani Som', value: 'kgs' }, - { name: 'Cambodian Riel', value: 'khr' }, - { name: 'Comorian Franc', value: 'kmf' }, - { name: 'North Korean Won', value: 'kpw' }, - { name: 'South Korean Won', value: 'krw' }, - { name: 'Kuwaiti Dinar', value: 'kwd' }, - { name: 'Cayman Islands Dollar', value: 'kyd' }, - { name: 'Kazakhstani Tenge', value: 'kzt' }, - { name: 'Laotian Kip', value: 'lak' }, - { name: 'Lebanese Pound', value: 'lbp' }, - { name: 'Sri Lankan Rupee', value: 'lkr' }, - { name: 'Liberian Dollar', value: 'lrd' }, - { name: 'Lesotho Loti', value: 'lsl' }, - { name: 'Libyan Dinar', value: 'lyd' }, - { name: 'Moroccan Dirham', value: 'mad' }, - { name: 'Moldovan Leu', value: 'mdl' }, - { name: 'Malagasy Ariary', value: 'mga' }, - { name: 'Macedonian Denar', value: 'mkd' }, - { name: 'Myanma Kyat', value: 'mmk' }, - { name: 'Mongolian Tugrik', value: 'mnt' }, - { name: 'Macanese Pataca', value: 'mop' }, - { name: 'Mauritanian Ouguiya (pre-2018)', value: 'mro' }, - { name: 'Mauritanian Ouguiya', value: 'mru' }, - { name: 'Mauritian Rupee', value: 'mur' }, - { name: 'Maldivian Rufiyaa', value: 'mvr' }, - { name: 'Malawian Kwacha', value: 'mwk' }, - { name: 'Mexican Peso', value: 'mxn' }, - { name: 'Malaysian Ringgit', value: 'myr' }, - { name: 'Mozambican Metical', value: 'mzn' }, - { name: 'Namibian Dollar', value: 'nad' }, - { name: 'Nigerian Naira', value: 'ngn' }, - { name: 'Nicaraguan Córdoba', value: 'nio' }, - { name: 'Norwegian Krone', value: 'nok' }, - { name: 'Nepalese Rupee', value: 'npr' }, - { name: 'New Zealand Dollar', value: 'nzd' }, - { name: 'Omani Rial', value: 'omr' }, - { name: 'Panamanian Balboa', value: 'pab' }, - { name: 'Peruvian Nuevo Sol', value: 'pen' }, - { name: 'Papua New Guinean Kina', value: 'pgk' }, - { name: 'Philippine Peso', value: 'php' }, - { name: 'Pakistani Rupee', value: 'pkr' }, - { name: 'Polish Zloty', value: 'pln' }, - { name: 'Paraguayan Guarani', value: 'pyg' }, - { name: 'Qatari Rial', value: 'qar' }, - { name: 'Romanian Leu', value: 'ron' }, - { name: 'Serbian Dinar', value: 'rsd' }, - { name: 'Russian Ruble', value: 'rub' }, - { name: 'Rwandan Franc', value: 'rwf' }, - { name: 'Saudi Riyal', value: 'sar' }, - { name: 'Solomon Islands Dollar', value: 'sbd' }, - { name: 'Seychellois Rupee', value: 'scr' }, - { name: 'Sudanese Pound', value: 'sdg' }, - { name: 'Swedish Krona', value: 'sek' }, - { name: 'Singapore Dollar', value: 'sgd' }, - { name: 'Saint Helena Pound', value: 'shp' }, - { name: 'Sierra Leonean Leone', value: 'sll' }, - { name: 'Somali Shilling', value: 'sos' }, - { name: 'Surinamese Dollar', value: 'srd' }, - { name: 'South Sudanese Pound', value: 'ssp' }, - { name: 'São Tomé and Príncipe Dobra (pre-2018)', value: 'std' }, - { name: 'São Tomé and Príncipe Dobra', value: 'stn' }, - { name: 'Salvadoran Colón', value: 'svc' }, - { name: 'Syrian Pound', value: 'syp' }, - { name: 'Swazi Lilangeni', value: 'szl' }, - { name: 'Thai Baht', value: 'thb' }, - { name: 'Tajikistani Somoni', value: 'tjs' }, - { name: 'Turkmenistani Manat', value: 'tmt' }, - { name: 'Tunisian Dinar', value: 'tnd' }, - { name: "Tongan Pa'anga", value: 'top' }, - { name: 'Turkish Lira', value: 'try' }, - { name: 'Trinidad and Tobago Dollar', value: 'ttd' }, - { name: 'New Taiwan Dollar', value: 'twd' }, - { name: 'Tanzanian Shilling', value: 'tzs' }, - { name: 'Ukrainian Hryvnia', value: 'uah' }, - { name: 'Ugandan Shilling', value: 'ugx' }, - { name: 'Uruguayan Peso', value: 'uyu' }, - { name: 'Uzbekistan Som', value: 'uzs' }, - { name: 'Venezuelan Bolívar Fuerte', value: 'vef' }, - { name: 'Vietnamese Dong', value: 'vnd' }, - { name: 'Vanuatu Vatu', value: 'vuv' }, - { name: 'Samoan Tala', value: 'wst' }, - { name: 'CFA Franc BEAC', value: 'xaf' }, - { name: 'Silver Ounce', value: 'xag' }, - { name: 'Gold Ounce', value: 'xau' }, - { name: 'East Caribbean Dollar', value: 'xcd' }, - { name: 'Special Drawing Rights', value: 'xdr' }, - { name: 'CFA Franc BCEAO', value: 'xof' }, - { name: 'Palladium Ounce', value: 'xpd' }, - { name: 'CFP Franc', value: 'xpf' }, - { name: 'Platinum Ounce', value: 'xpt' }, - { name: 'Yemeni Rial', value: 'yer' }, - { name: 'South African Rand', value: 'zar' }, - { name: 'Zambian Kwacha', value: 'zmw' }, - { name: 'Zimbabwean Dollar', value: 'zwl' } - ] -} \ No newline at end of file +export const allCurrencies = [ + { name: 'Euro', value: 'eur' }, + { name: 'United States Dollar', value: 'usd' }, + { name: 'British Pound Sterling', value: 'gbp' }, + { name: 'Swiss Franc', value: 'chf' }, + { name: 'Renminbi', value: 'cny' }, + { name: '--------', value: '' }, + { name: 'United Arab Emirates Dirham', value: 'aed' }, + { name: 'Afghan Afghani', value: 'afn' }, + { name: 'Albanian Lek', value: 'all' }, + { name: 'Armenian Dram', value: 'amd' }, + { name: 'Netherlands Antillean Guilder', value: 'ang' }, + { name: 'Angolan Kwanza', value: 'aoa' }, + { name: 'Argentine Peso', value: 'ars' }, + { name: 'Australian Dollar', value: 'aud' }, + { name: 'Aruban Florin', value: 'awg' }, + { name: 'Azerbaijani Manat', value: 'azn' }, + { name: 'Bosnia-Herzegovina Convertible Mark', value: 'bam' }, + { name: 'Barbadian Dollar', value: 'bbd' }, + { name: 'Bangladeshi Taka', value: 'bdt' }, + { name: 'Bulgarian Lev', value: 'bgn' }, + { name: 'Bahraini Dinar', value: 'bhd' }, + { name: 'Burundian Franc', value: 'bif' }, + { name: 'Bermudan Dollar', value: 'bmd' }, + { name: 'Brunei Dollar', value: 'bnd' }, + { name: 'Bolivian Boliviano', value: 'bob' }, + { name: 'Brazilian Real', value: 'brl' }, + { name: 'Bahamian Dollar', value: 'bsd' }, + { name: 'Bitcoin', value: 'btc' }, + { name: 'Bhutanese Ngultrum', value: 'btn' }, + { name: 'Botswanan Pula', value: 'bwp' }, + { name: 'Belarusian Ruble', value: 'byn' }, + { name: 'Belize Dollar', value: 'bzd' }, + { name: 'Canadian Dollar', value: 'cad' }, + { name: 'Congolese Franc', value: 'cdf' }, + { name: 'Chilean Unit of Account (UF)', value: 'clf' }, + { name: 'Chilean Peso', value: 'clp' }, + { name: 'Chinese Yuan (Offshore)', value: 'cnh' }, + { name: 'Colombian Peso', value: 'cop' }, + { name: 'Costa Rican Colón', value: 'crc' }, + { name: 'Cuban Convertible Peso', value: 'cuc' }, + { name: 'Cuban Peso', value: 'cup' }, + { name: 'Cape Verdean Escudo', value: 'cve' }, + { name: 'Czech Republic Koruna', value: 'czk' }, + { name: 'Djiboutian Franc', value: 'djf' }, + { name: 'Danish Krone', value: 'dkk' }, + { name: 'Dominican Peso', value: 'dop' }, + { name: 'Algerian Dinar', value: 'dzd' }, + { name: 'Egyptian Pound', value: 'egp' }, + { name: 'Eritrean Nakfa', value: 'ern' }, + { name: 'Ethiopian Birr', value: 'etb' }, + { name: 'Fijian Dollar', value: 'fjd' }, + { name: 'Falkland Islands Pound', value: 'fkp' }, + { name: 'Georgian Lari', value: 'gel' }, + { name: 'Guernsey Pound', value: 'ggp' }, + { name: 'Ghanaian Cedi', value: 'ghs' }, + { name: 'Gibraltar Pound', value: 'gip' }, + { name: 'Gambian Dalasi', value: 'gmd' }, + { name: 'Guinean Franc', value: 'gnf' }, + { name: 'Guatemalan Quetzal', value: 'gtq' }, + { name: 'Guyanaese Dollar', value: 'gyd' }, + { name: 'Hong Kong Dollar', value: 'hkd' }, + { name: 'Honduran Lempira', value: 'hnl' }, + { name: 'Croatian Kuna', value: 'hrk' }, + { name: 'Haitian Gourde', value: 'htg' }, + { name: 'Hungarian Forint', value: 'huf' }, + { name: 'Indonesian Rupiah', value: 'idr' }, + { name: 'Israeli New Sheqel', value: 'ils' }, + { name: 'Manx pound', value: 'imp' }, + { name: 'Indian Rupee', value: 'inr' }, + { name: 'Iraqi Dinar', value: 'iqd' }, + { name: 'Iranian Rial', value: 'irr' }, + { name: 'Icelandic Króna', value: 'isk' }, + { name: 'Jersey Pound', value: 'jep' }, + { name: 'Jamaican Dollar', value: 'jmd' }, + { name: 'Jordanian Dinar', value: 'jod' }, + { name: 'Japanese Yen', value: 'jpy' }, + { name: 'Kenyan Shilling', value: 'kes' }, + { name: 'Kyrgystani Som', value: 'kgs' }, + { name: 'Cambodian Riel', value: 'khr' }, + { name: 'Comorian Franc', value: 'kmf' }, + { name: 'North Korean Won', value: 'kpw' }, + { name: 'South Korean Won', value: 'krw' }, + { name: 'Kuwaiti Dinar', value: 'kwd' }, + { name: 'Cayman Islands Dollar', value: 'kyd' }, + { name: 'Kazakhstani Tenge', value: 'kzt' }, + { name: 'Laotian Kip', value: 'lak' }, + { name: 'Lebanese Pound', value: 'lbp' }, + { name: 'Sri Lankan Rupee', value: 'lkr' }, + { name: 'Liberian Dollar', value: 'lrd' }, + { name: 'Lesotho Loti', value: 'lsl' }, + { name: 'Libyan Dinar', value: 'lyd' }, + { name: 'Moroccan Dirham', value: 'mad' }, + { name: 'Moldovan Leu', value: 'mdl' }, + { name: 'Malagasy Ariary', value: 'mga' }, + { name: 'Macedonian Denar', value: 'mkd' }, + { name: 'Myanma Kyat', value: 'mmk' }, + { name: 'Mongolian Tugrik', value: 'mnt' }, + { name: 'Macanese Pataca', value: 'mop' }, + { name: 'Mauritanian Ouguiya (pre-2018)', value: 'mro' }, + { name: 'Mauritanian Ouguiya', value: 'mru' }, + { name: 'Mauritian Rupee', value: 'mur' }, + { name: 'Maldivian Rufiyaa', value: 'mvr' }, + { name: 'Malawian Kwacha', value: 'mwk' }, + { name: 'Mexican Peso', value: 'mxn' }, + { name: 'Malaysian Ringgit', value: 'myr' }, + { name: 'Mozambican Metical', value: 'mzn' }, + { name: 'Namibian Dollar', value: 'nad' }, + { name: 'Nigerian Naira', value: 'ngn' }, + { name: 'Nicaraguan Córdoba', value: 'nio' }, + { name: 'Norwegian Krone', value: 'nok' }, + { name: 'Nepalese Rupee', value: 'npr' }, + { name: 'New Zealand Dollar', value: 'nzd' }, + { name: 'Omani Rial', value: 'omr' }, + { name: 'Panamanian Balboa', value: 'pab' }, + { name: 'Peruvian Nuevo Sol', value: 'pen' }, + { name: 'Papua New Guinean Kina', value: 'pgk' }, + { name: 'Philippine Peso', value: 'php' }, + { name: 'Pakistani Rupee', value: 'pkr' }, + { name: 'Polish Zloty', value: 'pln' }, + { name: 'Paraguayan Guarani', value: 'pyg' }, + { name: 'Qatari Rial', value: 'qar' }, + { name: 'Romanian Leu', value: 'ron' }, + { name: 'Serbian Dinar', value: 'rsd' }, + { name: 'Russian Ruble', value: 'rub' }, + { name: 'Rwandan Franc', value: 'rwf' }, + { name: 'Saudi Riyal', value: 'sar' }, + { name: 'Solomon Islands Dollar', value: 'sbd' }, + { name: 'Seychellois Rupee', value: 'scr' }, + { name: 'Sudanese Pound', value: 'sdg' }, + { name: 'Swedish Krona', value: 'sek' }, + { name: 'Singapore Dollar', value: 'sgd' }, + { name: 'Saint Helena Pound', value: 'shp' }, + { name: 'Sierra Leonean Leone', value: 'sll' }, + { name: 'Somali Shilling', value: 'sos' }, + { name: 'Surinamese Dollar', value: 'srd' }, + { name: 'South Sudanese Pound', value: 'ssp' }, + { name: 'São Tomé and Príncipe Dobra (pre-2018)', value: 'std' }, + { name: 'São Tomé and Príncipe Dobra', value: 'stn' }, + { name: 'Salvadoran Colón', value: 'svc' }, + { name: 'Syrian Pound', value: 'syp' }, + { name: 'Swazi Lilangeni', value: 'szl' }, + { name: 'Thai Baht', value: 'thb' }, + { name: 'Tajikistani Somoni', value: 'tjs' }, + { name: 'Turkmenistani Manat', value: 'tmt' }, + { name: 'Tunisian Dinar', value: 'tnd' }, + { name: "Tongan Pa'anga", value: 'top' }, + { name: 'Turkish Lira', value: 'try' }, + { name: 'Trinidad and Tobago Dollar', value: 'ttd' }, + { name: 'New Taiwan Dollar', value: 'twd' }, + { name: 'Tanzanian Shilling', value: 'tzs' }, + { name: 'Ukrainian Hryvnia', value: 'uah' }, + { name: 'Ugandan Shilling', value: 'ugx' }, + { name: 'Uruguayan Peso', value: 'uyu' }, + { name: 'Uzbekistan Som', value: 'uzs' }, + { name: 'Venezuelan Bolívar Fuerte', value: 'vef' }, + { name: 'Vietnamese Dong', value: 'vnd' }, + { name: 'Vanuatu Vatu', value: 'vuv' }, + { name: 'Samoan Tala', value: 'wst' }, + { name: 'CFA Franc BEAC', value: 'xaf' }, + { name: 'Silver Ounce', value: 'xag' }, + { name: 'Gold Ounce', value: 'xau' }, + { name: 'East Caribbean Dollar', value: 'xcd' }, + { name: 'Special Drawing Rights', value: 'xdr' }, + { name: 'CFA Franc BCEAO', value: 'xof' }, + { name: 'Palladium Ounce', value: 'xpd' }, + { name: 'CFP Franc', value: 'xpf' }, + { name: 'Platinum Ounce', value: 'xpt' }, + { name: 'Yemeni Rial', value: 'yer' }, + { name: 'South African Rand', value: 'zar' }, + { name: 'Zambian Kwacha', value: 'zmw' }, + { name: 'Zimbabwean Dollar', value: 'zwl' } +] From 2c4702d75c152b27b193bab0f4de44f4112b4ea4 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sun, 3 Nov 2019 12:49:03 +0100 Subject: [PATCH 33/66] format changes --- .../ActiveCampaign/EcomOrderDescription.ts | 1315 ++++++++--------- 1 file changed, 656 insertions(+), 659 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts index 846c5cd35..968898e21 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts @@ -3,8 +3,6 @@ import { INodeProperties } from "n8n-workflow"; import { allCurrencies } from './currencies'; export const ecomOrderOperations = [ - - { displayName: 'Operation', name: 'operation', @@ -49,671 +47,670 @@ export const ecomOrderOperations = [ ] as INodeProperties[] export const ecomOrderFields = [ + // ---------------------------------- + // ecommerceOrder:create + // ---------------------------------- + { + displayName: 'External ID', + name: 'externalid', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', + }, + { + displayName: 'External checkout ID', + name: 'externalcheckoutid', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', + }, + { + displayName: 'Order source', + name: 'source', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The email address of the customer who placed the order.', + }, + { + displayName: 'Total price', + name: 'totalPrice', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Order currency', + name: 'currency', + type: 'options', + default: 'eur', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + options: allCurrencies, + description: 'The currency of the order (3-digit ISO code, e.g., "USD").', + }, + { + displayName: 'Connection ID', + name: 'connectionid', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the connection from which this order originated.', + }, + { + displayName: 'Customer ID', + name: 'customerid', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the customer associated with this order.', + }, + { + displayName: 'Creation Date', + name: 'externalCreatedDate', + type: 'dateTime', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The date the order was placed.', + }, + { + displayName: 'Abandoning Date', + name: 'abandonedDate', + type: 'dateTime', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', + }, + { + displayName: 'Products', + name: 'orderProducts', + type: 'collection', + typeOptions: { + multipleValues: true, + multipleValueButtonText: 'Add product', + }, + displayOptions: { + show: { + operation: [ + 'create' + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + description: 'All ordered products', + placeholder: 'Add product field', + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'The name of the product', + }, + { + displayName: 'Price', + name: 'price', + type: 'number', + default: 0, + description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Product Quantity', + name: 'quantity', + type: 'number', + default: 0, + description: 'The quantity ordered.', + }, + { + displayName: 'Product external ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the product in the external service.', + }, + { + displayName: 'Product Category', + name: 'category', + type: 'string', + default: '', + description: 'The category of the product.', + }, + { + displayName: 'SKU', + name: 'sku', + type: 'string', + default: '', + description: 'The SKU for the product.', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the product.', + }, + { + displayName: 'Image URL', + name: 'imageUrl', + type: 'string', + default: '', + description: 'An Image URL that displays an image of the product.', + }, + { + displayName: 'Product URL', + name: 'productUrl', + type: 'string', + default: '', + description: 'A URL linking to the product in your store.', + }, + ], + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Shipping Amount', + name: 'shippingAmount', + type: 'number', + default: 0, + description: 'The total shipping amount for the order in cents .', + }, - // ---------------------------------- - // ecommerceOrder:create - // ---------------------------------- - { - displayName: 'External ID', - name: 'externalid', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', - }, - { - displayName: 'External checkout ID', - name: 'externalcheckoutid', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', - }, - { - displayName: 'Order source', - name: 'source', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', - }, - { - displayName: 'Customer Email', - name: 'email', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The email address of the customer who placed the order.', - }, - { - displayName: 'Total price', - name: 'totalPrice', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Order currency', - name: 'currency', - type: 'options', - default: 'eur', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - options: allCurrencies, - description: 'The currency of the order (3-digit ISO code, e.g., "USD").', - }, - { - displayName: 'Connection ID', - name: 'connectionid', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the connection from which this order originated.', - }, - { - displayName: 'Customer ID', - name: 'customerid', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the customer associated with this order.', - }, - { - displayName: 'Creation Date', - name: 'externalCreatedDate', - type: 'dateTime', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The date the order was placed.', - }, - { - displayName: 'Abandoning Date', - name: 'abandonedDate', - type: 'dateTime', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', - }, - { - displayName: 'Products', - name: 'orderProducts', - type: 'collection', - typeOptions: { - multipleValues: true, - multipleValueButtonText: 'Add product', - }, - displayOptions: { - show: { - operation: [ - 'create' - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: {}, - description: 'All ordered products', - placeholder: 'Add product field', - options: [ - { - displayName: 'Name', - name: 'name', - type: 'string', - default: '', - description: 'The name of the product', - }, - { - displayName: 'Price', - name: 'price', - type: 'number', - default: 0, - description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Product Quantity', - name: 'quantity', - type: 'number', - default: 0, - description: 'The quantity ordered.', - }, - { - displayName: 'Product external ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the product in the external service.', - }, - { - displayName: 'Product Category', - name: 'category', - type: 'string', - default: '', - description: 'The category of the product.', - }, - { - displayName: 'SKU', - name: 'sku', - type: 'string', - default: '', - description: 'The SKU for the product.', - }, - { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the product.', - }, - { - displayName: 'Image URL', - name: 'imageUrl', - type: 'string', - default: '', - description: 'An Image URL that displays an image of the product.', - }, - { - displayName: 'Product URL', - name: 'productUrl', - type: 'string', - default: '', - description: 'A URL linking to the product in your store.', - }, - ], - }, - { - displayName: 'Additional Fields', - name: 'additionalFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Shipping Amount', - name: 'shippingAmount', - type: 'number', - default: 0, - description: 'The total shipping amount for the order in cents .', - }, + { + displayName: 'Tax Amount', + name: 'taxAmount', + type: 'number', + default: 0, + description: 'The total tax amount for the order in cents.', + }, + { + displayName: 'Discount Amount', + name: 'discountAmount', + type: 'number', + default: 0, + description: 'The total discount amount for the order in cents.', + }, + { + displayName: 'Order URL', + name: 'orderUrl', + type: 'string', + default: '', + description: 'The URL for the order in the external service.', + }, + { + displayName: 'External updated date', + name: 'externalUpdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was updated.', + }, + { + displayName: 'Shipping Method', + name: 'shippingMethod', + type: 'string', + default: '', + description: 'The shipping method of the order.', + }, + { + displayName: 'Order Number', + name: 'orderNumber', + type: 'string', + default: '', + description: 'The order number. This can be different than the externalid.', + }, - { - displayName: 'Tax Amount', - name: 'taxAmount', - type: 'number', - default: 0, - description: 'The total tax amount for the order in cents.', - }, - { - displayName: 'Discount Amount', - name: 'discountAmount', - type: 'number', - default: 0, - description: 'The total discount amount for the order in cents.', - }, - { - displayName: 'Order URL', - name: 'orderUrl', - type: 'string', - default: '', - description: 'The URL for the order in the external service.', - }, - { - displayName: 'External updated date', - name: 'externalUpdatedDate', - type: 'dateTime', - default: '', - description: 'The date the order was updated.', - }, - { - displayName: 'Shipping Method', - name: 'shippingMethod', - type: 'string', - default: '', - description: 'The shipping method of the order.', - }, - { - displayName: 'Order Number', - name: 'orderNumber', - type: 'string', - default: '', - description: 'The order number. This can be different than the externalid.', - }, + ] + }, - ] - }, + // ---------------------------------- + // ecommerceOrder:update + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, - // ---------------------------------- - // ecommerceOrder:update - // ---------------------------------- - { - displayName: 'Order ID', - name: 'orderId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the e-commerce order.', - }, + { + displayName: 'Add Field', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'External ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', + }, + { + displayName: 'External checkout ID', + name: 'externalcheckoutid', + type: 'string', + default: '', + description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', + }, + { + displayName: 'Order source', + name: 'source', + type: 'number', + default: 0, + description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + description: 'The email address of the customer who placed the order.', + }, + { + displayName: 'Total price', + name: 'totalPrice', + type: 'number', + default: 0, + description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Order currency', + name: 'currency', + type: 'options', + default: 'eur', + options: allCurrencies, + description: 'The currency of the order (3-digit ISO code, e.g., "USD").', + }, + { + displayName: 'Connection ID', + name: 'connectionid', + type: 'number', + default: 0, + description: 'The id of the connection from which this order originated.', + }, + { + displayName: 'Customer ID', + name: 'customerid', + type: 'number', + default: 0, + description: 'The id of the customer associated with this order.', + }, + { + displayName: 'Creation Date', + name: 'externalupdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was placed.', + }, + { + displayName: 'Abandoning Date', + name: 'abandonedDate', + type: 'dateTime', + default: '', + description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', + }, + { + displayName: 'Shipping Amount', + name: 'shippingAmount', + type: 'number', + default: 0, + description: 'The total shipping amount for the order in cents .', + }, - { - displayName: 'Add Field', - name: 'updateFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'External ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', - }, - { - displayName: 'External checkout ID', - name: 'externalcheckoutid', - type: 'string', - default: '', - description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', - }, - { - displayName: 'Order source', - name: 'source', - type: 'number', - default: 0, - description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', - }, - { - displayName: 'Customer Email', - name: 'email', - type: 'string', - default: '', - description: 'The email address of the customer who placed the order.', - }, - { - displayName: 'Total price', - name: 'totalPrice', - type: 'number', - default: 0, - description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Order currency', - name: 'currency', - type: 'options', - default: 'eur', - options: allCurrencies, - description: 'The currency of the order (3-digit ISO code, e.g., "USD").', - }, - { - displayName: 'Connection ID', - name: 'connectionid', - type: 'number', - default: 0, - description: 'The id of the connection from which this order originated.', - }, - { - displayName: 'Customer ID', - name: 'customerid', - type: 'number', - default: 0, - description: 'The id of the customer associated with this order.', - }, - { - displayName: 'Creation Date', - name: 'externalupdatedDate', - type: 'dateTime', - default: '', - description: 'The date the order was placed.', - }, - { - displayName: 'Abandoning Date', - name: 'abandonedDate', - type: 'dateTime', - default: '', - description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', - }, - { - displayName: 'Shipping Amount', - name: 'shippingAmount', - type: 'number', - default: 0, - description: 'The total shipping amount for the order in cents .', - }, + { + displayName: 'Tax Amount', + name: 'taxAmount', + type: 'number', + default: 0, + description: 'The total tax amount for the order in cents.', + }, + { + displayName: 'Discount Amount', + name: 'discountAmount', + type: 'number', + default: 0, + description: 'The total discount amount for the order in cents.', + }, + { + displayName: 'Order URL', + name: 'orderUrl', + type: 'string', + default: '', + description: 'The URL for the order in the external service.', + }, + { + displayName: 'External updated date', + name: 'externalUpdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was updated.', + }, + { + displayName: 'Shipping Method', + name: 'shippingMethod', + type: 'string', + default: '', + description: 'The shipping method of the order.', + }, + { + displayName: 'Order Number', + name: 'orderNumber', + type: 'string', + default: '', + description: 'The order number. This can be different than the externalid.', + }, - { - displayName: 'Tax Amount', - name: 'taxAmount', - type: 'number', - default: 0, - description: 'The total tax amount for the order in cents.', - }, - { - displayName: 'Discount Amount', - name: 'discountAmount', - type: 'number', - default: 0, - description: 'The total discount amount for the order in cents.', - }, - { - displayName: 'Order URL', - name: 'orderUrl', - type: 'string', - default: '', - description: 'The URL for the order in the external service.', - }, - { - displayName: 'External updated date', - name: 'externalUpdatedDate', - type: 'dateTime', - default: '', - description: 'The date the order was updated.', - }, - { - displayName: 'Shipping Method', - name: 'shippingMethod', - type: 'string', - default: '', - description: 'The shipping method of the order.', - }, - { - displayName: 'Order Number', - name: 'orderNumber', - type: 'string', - default: '', - description: 'The order number. This can be different than the externalid.', - }, + { + displayName: 'Products', + name: 'orderProducts', + type: 'collection', + typeOptions: { + multipleValues: true, + multipleValueButtonText: 'Add product', + }, + default: {}, + description: 'All ordered products', + placeholder: 'Add product field', + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'The name of the product', + }, + { + displayName: 'Price', + name: 'price', + type: 'number', + default: 0, + description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Product Quantity', + name: 'quantity', + type: 'number', + default: 0, + description: 'The quantity ordered.', + }, + { + displayName: 'Product external ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the product in the external service.', + }, + { + displayName: 'Product Category', + name: 'category', + type: 'string', + default: '', + description: 'The category of the product.', + }, + { + displayName: 'SKU', + name: 'sku', + type: 'string', + default: '', + description: 'The SKU for the product.', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the product.', + }, + { + displayName: 'Image URL', + name: 'imageUrl', + type: 'string', + default: '', + description: 'An Image URL that displays an image of the product.', + }, + { + displayName: 'Product URL', + name: 'productUrl', + type: 'string', + default: '', + description: 'A URL linking to the product in your store.', + }, + ], + }, - { - displayName: 'Products', - name: 'orderProducts', - type: 'collection', - typeOptions: { - multipleValues: true, - multipleValueButtonText: 'Add product', - }, - default: {}, - description: 'All ordered products', - placeholder: 'Add product field', - options: [ - { - displayName: 'Name', - name: 'name', - type: 'string', - default: '', - description: 'The name of the product', - }, - { - displayName: 'Price', - name: 'price', - type: 'number', - default: 0, - description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Product Quantity', - name: 'quantity', - type: 'number', - default: 0, - description: 'The quantity ordered.', - }, - { - displayName: 'Product external ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the product in the external service.', - }, - { - displayName: 'Product Category', - name: 'category', - type: 'string', - default: '', - description: 'The category of the product.', - }, - { - displayName: 'SKU', - name: 'sku', - type: 'string', - default: '', - description: 'The SKU for the product.', - }, - { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the product.', - }, - { - displayName: 'Image URL', - name: 'imageUrl', - type: 'string', - default: '', - description: 'An Image URL that displays an image of the product.', - }, - { - displayName: 'Product URL', - name: 'productUrl', - type: 'string', - default: '', - description: 'A URL linking to the product in your store.', - }, - ], - }, + ] + }, - ] - }, + // ---------------------------------- + // ecommerceOrder:delete + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, - // ---------------------------------- - // ecommerceOrder:delete - // ---------------------------------- - { - displayName: 'Order ID', - name: 'orderId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the e-commerce order.', - }, + // ---------------------------------- + // ecommerceOrder:get + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, - // ---------------------------------- - // ecommerceOrder:get - // ---------------------------------- - { - displayName: 'Order ID', - name: 'orderId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the e-commerce order.', - }, - - // ---------------------------------- - // ecommerceOrder:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'ecommerceOrder', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, + // ---------------------------------- + // ecommerceOrder:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrder', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, ] as INodeProperties[] \ No newline at end of file From 0da9c035874f0d1a160cec50cf4a3e0890b3dda5 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sun, 3 Nov 2019 16:42:18 +0100 Subject: [PATCH 34/66] add ecom customer functionality --- .../ActiveCampaign/ActiveCampaign.node.ts | 112 ++++++- .../ActiveCampaign/EcomCustomerDescription.ts | 290 ++++++++++++++++++ 2 files changed, 399 insertions(+), 3 deletions(-) create mode 100644 packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 127d06c45..ae163d748 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -30,6 +30,11 @@ import { ecomOrderFields } from './EcomOrderDescription'; +import { + ecomCustomerOperations, + ecomCustomerFields +} from './EcomCustomerDescription'; + interface CustomProperty { name: string; value: string; @@ -93,9 +98,13 @@ export class ActiveCampaign implements INodeType { value: 'deal', }, { - name: "E-commerce order", - value: "ecommerceOrder" - } + name: "E-commerce Order", + value: "ecommerceOrder", + }, + { + name: "E-Commerce Customer", + value: "ecommerceCustomer", + }, ], default: 'contact', description: 'The resource to operate on.', @@ -107,6 +116,7 @@ export class ActiveCampaign implements INodeType { ...contactOperations, ...dealOperations, ...ecomOrderOperations, + ...ecomCustomerOperations, // ---------------------------------- // contact @@ -123,6 +133,11 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- ...ecomOrderFields, + // ---------------------------------- + // ecommerceCustomer + // ---------------------------------- + ...ecomCustomerFields, + ], }; @@ -444,6 +459,95 @@ export class ActiveCampaign implements INodeType { } else { throw new Error(`The operation "${operation}" is not known`); } + } else if (resource === 'ecommerceCustomer') { + if (operation === 'create') { + // ---------------------------------- + // ecommerceCustomer:create + // ---------------------------------- + + requestMethod = 'POST'; + + endpoint = '/api/3/ecomCustomers'; + + dataKey = 'ecommerceCustomer'; + + body.ecomCustomer = { + connectionid: this.getNodeParameter('connectionid', i) as string, + externalid: this.getNodeParameter('externalid', i) as string, + email: this.getNodeParameter('email', i) as string, + } as IDataObject; + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + if (additionalFields.acceptsMarketing) { + if (additionalFields.acceptsMarketing == true) { + additionalFields.acceptsMarketing = '1'; + } else { + additionalFields.acceptsMarketing = '0'; + } + } + addAdditionalFields(body.ecomOrder as IDataObject, additionalFields); + + } else if (operation === 'update') { + // ---------------------------------- + // ecommerceCustomer:update + // ---------------------------------- + + requestMethod = 'PUT'; + + const ecommerceCustomerId = this.getNodeParameter('ecommerceCustomerId', i) as number; + endpoint = `/api/3/ecomCustomers/${ecommerceCustomerId}`; + + dataKey = 'ecommerceCustomer'; + body.ecomCustomer = {} as IDataObject; + + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + if (updateFields.acceptsMarketing) { + if (updateFields.acceptsMarketing == true) { + updateFields.acceptsMarketing = '1'; + } else { + updateFields.acceptsMarketing = '0'; + } + } + addAdditionalFields(body.ecomCustomer as IDataObject, updateFields); + + } else if (operation === 'delete') { + // ---------------------------------- + // ecommerceCustomer:delete + // ---------------------------------- + + requestMethod = 'DELETE'; + + const ecommerceCustomerId = this.getNodeParameter('ecommerceCustomerId', i) as number; + endpoint = `/api/3/ecomCustomers/${ecommerceCustomerId}`; + + } else if (operation === 'get') { + // ---------------------------------- + // ecommerceCustomer:get + // ---------------------------------- + + requestMethod = 'GET'; + + const ecommerceCustomerId = this.getNodeParameter('ecommerceCustomerId', i) as number; + endpoint = `/api/3/ecomCustomers/${ecommerceCustomerId}`; + + } else if (operation === 'getAll') { + // ---------------------------------- + // ecommerceCustomers:getAll + // ---------------------------------- + + requestMethod = 'GET'; + + returnAll = this.getNodeParameter('returnAll', i) as boolean; + if (returnAll === false) { + qs.limit = this.getNodeParameter('limit', i) as number; + } + + dataKey = 'ecommerceCustomers'; + endpoint = `/api/3/ecomCustomers`; + + } else { + throw new Error(`The operation "${operation}" is not known`); + } } else { throw new Error(`The resource "${resource}" is not known!`); @@ -463,6 +567,8 @@ export class ActiveCampaign implements INodeType { } } + console.log(body) + return [this.helpers.returnJsonArray(returnData)]; } } diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts new file mode 100644 index 000000000..4399ca3fa --- /dev/null +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts @@ -0,0 +1,290 @@ +import { INodeProperties } from "n8n-workflow"; + +export const ecomCustomerOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'ecommerceCustomer', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a ecommerceCustomer', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a ecommerceCustomer', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a ecommerceCustomer', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all ecommerceCustomer', + }, + { + name: 'Update', + value: 'update', + description: 'Update a ecommerceCustomer', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, +] as INodeProperties[] + +export const ecomCustomerFields = [ + // ---------------------------------- + // ecommerceCustomer:create + // ---------------------------------- + { + displayName: 'Service ID', + name: 'connectionid', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + description: 'The id of the connection object for the service where the customer originates.', + }, + { + displayName: 'Customer ID', + name: 'externalid', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + description: 'The id of the customer in the external service.', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + description: 'The email address of the customer.', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Accepts Marketing', + name: 'acceptsMarketing', + type: 'boolean', + default: false, + description: 'Indication of whether customer has opt-ed in to marketing communications.', + }, + ], + }, + + // ---------------------------------- + // ecommerceCustomer:update + // ---------------------------------- + { + displayName: 'Customer ID', + name: 'ecommerceCustomerId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the ecommerceCustomer to update.', + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + description: 'The fields to update.', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Service ID', + name: 'connectionid', + type: 'string', + default: '', + description: 'The id of the connection object for the service where the customer originates.', + }, + { + displayName: 'Customer ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the customer in the external service.', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + description: 'The email address of the customer.', + }, + { + displayName: 'Accepts Marketing', + name: 'acceptsMarketing', + type: 'boolean', + default: false, + description: 'Indication of whether customer has opt-ed in to marketing communications.', + }, + ], + }, + + // ---------------------------------- + // ecommerceCustomer:delete + // ---------------------------------- + { + displayName: 'Customer ID', + name: 'ecommerceCustomerId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the ecommerceCustomer to update.', + }, + + // ---------------------------------- + // ecommerceCustomer:get + // ---------------------------------- + { + displayName: 'Customer ID', + name: 'ecommerceCustomerId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the ecommerceCustomer to update.', + }, + + // ---------------------------------- + // ecommerceCustomer:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceCustomer', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, +] as INodeProperties[] From 9a3a0d150b2572ad29e10fd2dbd0ded42c6cc53d Mon Sep 17 00:00:00 2001 From: quansenB Date: Sun, 3 Nov 2019 17:58:46 +0100 Subject: [PATCH 35/66] add ecom order products option decrisption --- .../ActiveCampaign/ActiveCampaign.node.ts | 39 ++---- .../ActiveCampaign/EcomCustomerDescription.ts | 10 +- .../EcomOrderProductsDescription.ts | 127 ++++++++++++++++++ .../nodes/ActiveCampaign/GenericFunctions.ts | 8 +- 4 files changed, 152 insertions(+), 32 deletions(-) create mode 100644 packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index ae163d748..67153c18a 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -98,13 +98,17 @@ export class ActiveCampaign implements INodeType { value: 'deal', }, { - name: "E-commerce Order", - value: "ecommerceOrder", + name: 'E-commerce Order', + value: 'ecommerceOrder', }, { - name: "E-Commerce Customer", - value: "ecommerceCustomer", + name: 'E-Commerce Customer', + value: 'ecommerceCustomer', }, + { + name: 'E-commerce Order Products', + value: 'ecomerceOrderProducts' + } ], default: 'contact', description: 'The resource to operate on.', @@ -254,8 +258,6 @@ export class ActiveCampaign implements INodeType { endpoint = '/api/3/deals'; - dataKey = 'deal'; - body.deal = { title: this.getNodeParameter('title', i) as string, contact: this.getNodeParameter('contact', i) as string, @@ -291,8 +293,8 @@ export class ActiveCampaign implements INodeType { const dealId = this.getNodeParameter('dealId', i) as number; endpoint = `/api/3/deals/${dealId}`; - dataKey = 'deal'; body.deal = {} as IDataObject; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; addAdditionalFields(body.deal as IDataObject, updateFields); @@ -328,7 +330,6 @@ export class ActiveCampaign implements INodeType { qs.limit = this.getNodeParameter('limit', i) as number; } - dataKey = 'deals'; endpoint = `/api/3/deals`; } else if (operation === 'createNote') { @@ -358,7 +359,6 @@ export class ActiveCampaign implements INodeType { const dealNoteId = this.getNodeParameter('dealNoteId', i) as number; endpoint = `/api/3/deals/${dealId}/notes/${dealNoteId}`; - } else { throw new Error(`The operation "${operation}" is not known`); } @@ -372,8 +372,6 @@ export class ActiveCampaign implements INodeType { endpoint = '/api/3/ecomOrders'; - dataKey = 'ecommerceOrder'; - body.ecomOrder = { source: this.getNodeParameter('source', i) as string, email: this.getNodeParameter('email', i) as string, @@ -415,7 +413,6 @@ export class ActiveCampaign implements INodeType { const orderId = this.getNodeParameter('orderId', i) as number; endpoint = `/api/3/ecomOrders/${orderId}`; - dataKey = 'ecommerceOrder'; body.ecomOrder = {} as IDataObject; const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; @@ -453,7 +450,6 @@ export class ActiveCampaign implements INodeType { qs.limit = this.getNodeParameter('limit', i) as number; } - dataKey = 'ecommerceOrders'; endpoint = `/api/3/ecomOrders`; } else { @@ -469,8 +465,6 @@ export class ActiveCampaign implements INodeType { endpoint = '/api/3/ecomCustomers'; - dataKey = 'ecommerceCustomer'; - body.ecomCustomer = { connectionid: this.getNodeParameter('connectionid', i) as string, externalid: this.getNodeParameter('externalid', i) as string, @@ -478,14 +472,14 @@ export class ActiveCampaign implements INodeType { } as IDataObject; const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; - if (additionalFields.acceptsMarketing) { + if (additionalFields.acceptsMarketing !== undefined) { if (additionalFields.acceptsMarketing == true) { additionalFields.acceptsMarketing = '1'; } else { additionalFields.acceptsMarketing = '0'; } - } - addAdditionalFields(body.ecomOrder as IDataObject, additionalFields); + } + addAdditionalFields(body.ecomCustomer as IDataObject, additionalFields); } else if (operation === 'update') { // ---------------------------------- @@ -497,11 +491,10 @@ export class ActiveCampaign implements INodeType { const ecommerceCustomerId = this.getNodeParameter('ecommerceCustomerId', i) as number; endpoint = `/api/3/ecomCustomers/${ecommerceCustomerId}`; - dataKey = 'ecommerceCustomer'; body.ecomCustomer = {} as IDataObject; const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; - if (updateFields.acceptsMarketing) { + if (updateFields.acceptsMarketing != undefined) { if (updateFields.acceptsMarketing == true) { updateFields.acceptsMarketing = '1'; } else { @@ -542,7 +535,6 @@ export class ActiveCampaign implements INodeType { qs.limit = this.getNodeParameter('limit', i) as number; } - dataKey = 'ecommerceCustomers'; endpoint = `/api/3/ecomCustomers`; } else { @@ -567,9 +559,6 @@ export class ActiveCampaign implements INodeType { } } - console.log(body) - return [this.helpers.returnJsonArray(returnData)]; } -} - +} \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts index 4399ca3fa..53842df99 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts @@ -16,27 +16,27 @@ export const ecomCustomerOperations = [ { name: 'Create', value: 'create', - description: 'Create a ecommerceCustomer', + description: 'Create a E-commerce Customer', }, { name: 'Delete', value: 'delete', - description: 'Delete a ecommerceCustomer', + description: 'Delete a E-commerce Customer', }, { name: 'Get', value: 'get', - description: 'Get data of a ecommerceCustomer', + description: 'Get data of a E-commerce Customer', }, { name: 'Get All', value: 'getAll', - description: 'Get data of all ecommerceCustomer', + description: 'Get data of all E-commerce Customer', }, { name: 'Update', value: 'update', - description: 'Update a ecommerceCustomer', + description: 'Update a E-commerce Customer', }, ], default: 'create', diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts new file mode 100644 index 000000000..ec28fafe8 --- /dev/null +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts @@ -0,0 +1,127 @@ +import { INodeProperties } from "n8n-workflow"; + +import { allCurrencies } from './currencies'; + +export const ecomOrderProductsOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'ecommerceOrderProducts', + ], + }, + }, + options: [ + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all orders', + }, + { + name: 'Get by Product ID', + value: 'getByProductId', + description: 'Get data of a order', + }, + { + name: 'Get by Order ID', + value: 'getByOrderId', + description: 'Get data of a order', + }, + + ], + default: 'create', + description: 'The operation to perform.', + }, +] as INodeProperties[] + +export const ecomOrderProductsFields = [ + // ---------------------------------- + // ecommerceOrderProducts:getByOrderId + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'getByOrderId', + ], + resource: [ + 'ecommerceOrderProducts', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, + + // ---------------------------------- + // ecommerceOrderProducts:getByProductId + // ---------------------------------- + { + displayName: 'Product ID', + name: 'procuctId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'getByProductId', + ], + resource: [ + 'ecommerceOrderProducts', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, + + // ---------------------------------- + // ecommerceOrderProducts:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrderProducts', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrderProducts', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, +] as INodeProperties[] \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts b/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts index 932f73e2c..769effe9e 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts @@ -105,10 +105,14 @@ export async function activeCampaignApiRequestAllItems(this: IHookFunctions | IE if (dataKey === undefined) { returnData.push.apply(returnData, responseData); - itemsReceived += returnData.length; + if (returnData != undefined) { + itemsReceived += returnData.length; + } } else { returnData.push.apply(returnData, responseData[dataKey]); - itemsReceived += responseData[dataKey].length; + if (responseData[dataKey] != undefined) { + itemsReceived += responseData[dataKey].length; + } } query.offset = itemsReceived; From e764748aa11c4502b1a2b4bc8afea0da43686d47 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sun, 3 Nov 2019 21:18:58 +0100 Subject: [PATCH 36/66] add ecommerce order products functionality --- .../ActiveCampaign/ActiveCampaign.node.ts | 53 ++++++++++++++++++- .../EcomOrderProductsDescription.ts | 15 +++--- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 67153c18a..2c2f03a2a 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -34,6 +34,7 @@ import { ecomCustomerOperations, ecomCustomerFields } from './EcomCustomerDescription'; +import { ecomOrderProductsOperations, ecomOrderProductsFields } from './EcomOrderProductsDescription'; interface CustomProperty { name: string; @@ -107,7 +108,7 @@ export class ActiveCampaign implements INodeType { }, { name: 'E-commerce Order Products', - value: 'ecomerceOrderProducts' + value: 'ecommerceOrderProducts' } ], default: 'contact', @@ -121,6 +122,7 @@ export class ActiveCampaign implements INodeType { ...dealOperations, ...ecomOrderOperations, ...ecomCustomerOperations, + ...ecomOrderProductsOperations, // ---------------------------------- // contact @@ -142,6 +144,11 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- ...ecomCustomerFields, + // ---------------------------------- + // ecommerceOrderProducts + // ---------------------------------- + ...ecomOrderProductsFields, + ], }; @@ -478,7 +485,7 @@ export class ActiveCampaign implements INodeType { } else { additionalFields.acceptsMarketing = '0'; } - } + } addAdditionalFields(body.ecomCustomer as IDataObject, additionalFields); } else if (operation === 'update') { @@ -540,6 +547,48 @@ export class ActiveCampaign implements INodeType { } else { throw new Error(`The operation "${operation}" is not known`); } + } else if (resource === 'ecommerceOrderProducts') { + if (operation === 'getByProductId') { + // ---------------------------------- + // ecommerceOrderProducts:getByProductId + // ---------------------------------- + + requestMethod = 'GET'; + + const procuctId = this.getNodeParameter('procuctId', i) as number; + endpoint = `/api/3/ecomOrderProducts/${procuctId}`; + + + } else if (operation === 'getByOrderId') { + // ---------------------------------- + // ecommerceOrderProducts:getByOrderId + // ---------------------------------- + + requestMethod = 'GET'; + + const orderId = this.getNodeParameter('orderId', i) as number; + endpoint = `/api/3/ecomOrders/${orderId}/orderProducts`; + + } else if (operation === 'getAll') { + // ---------------------------------- + // ecommerceOrderProductss:getAll + // ---------------------------------- + + requestMethod = 'GET'; + + returnAll = this.getNodeParameter('returnAll', i) as boolean; + if (returnAll === false) { + qs.limit = this.getNodeParameter('limit', i) as number; + } + + endpoint = `/api/3/ecomOrderProducts`; + + } else { + throw new Error(`The operation "${operation}" is not known`); + } + + console.log(endpoint); + console.log(body) } else { throw new Error(`The resource "${resource}" is not known!`); diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts index ec28fafe8..fbff8787d 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts @@ -1,7 +1,5 @@ import { INodeProperties } from "n8n-workflow"; -import { allCurrencies } from './currencies'; - export const ecomOrderProductsOperations = [ { displayName: 'Operation', @@ -18,21 +16,20 @@ export const ecomOrderProductsOperations = [ { name: 'Get All', value: 'getAll', - description: 'Get data of all orders', + description: 'Get data of all order products', }, { name: 'Get by Product ID', value: 'getByProductId', - description: 'Get data of a order', + description: 'Get data of a ordered product', }, { name: 'Get by Order ID', value: 'getByOrderId', - description: 'Get data of a order', + description: 'Get data of an order\'s products', }, - ], - default: 'create', + default: 'getAll', description: 'The operation to perform.', }, ] as INodeProperties[] @@ -56,7 +53,7 @@ export const ecomOrderProductsFields = [ ], }, }, - description: 'The id of the e-commerce order.', + description: 'The ID of the order whose products you\'d like returned.', }, // ---------------------------------- @@ -77,7 +74,7 @@ export const ecomOrderProductsFields = [ ], }, }, - description: 'The id of the e-commerce order.', + description: 'The ID of the product you\'d like returned.', }, // ---------------------------------- From bc6acaff7292065df723e1210b2a043cc6a235f9 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sun, 3 Nov 2019 21:47:23 +0100 Subject: [PATCH 37/66] tslint changes --- .../ActiveCampaign/ActiveCampaign.node.ts | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 2c2f03a2a..0b63c45a0 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -196,9 +196,11 @@ export class ActiveCampaign implements INodeType { } dataKey = 'contact'; + body.contact = { email: this.getNodeParameter('email', i) as string, } as IDataObject; + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; addAdditionalFields(body.contact as IDataObject, additionalFields); @@ -269,22 +271,22 @@ export class ActiveCampaign implements INodeType { title: this.getNodeParameter('title', i) as string, contact: this.getNodeParameter('contact', i) as string, value: this.getNodeParameter('value', i) as number, - currency: this.getNodeParameter('currency', i) as string + currency: this.getNodeParameter('currency', i) as string, } as IDataObject; - const group = this.getNodeParameter('group', i) as string + const group = this.getNodeParameter('group', i) as string; if (group !== '') { - addAdditionalFields(body.deal as IDataObject, { group }) + addAdditionalFields(body.deal as IDataObject, { group }); } - const owner = this.getNodeParameter('owner', i) as string + const owner = this.getNodeParameter('owner', i) as string; if (owner !== '') { - addAdditionalFields(body.deal as IDataObject, { owner }) + addAdditionalFields(body.deal as IDataObject, { owner }); } - const stage = this.getNodeParameter('stage', i) as string + const stage = this.getNodeParameter('stage', i) as string; if (stage !== '') { - addAdditionalFields(body.deal as IDataObject, { stage }) + addAdditionalFields(body.deal as IDataObject, { stage }); } const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; @@ -343,11 +345,11 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- // deal:createNote // ---------------------------------- - requestMethod = 'POST' + requestMethod = 'POST'; body.note = { note: this.getNodeParameter('dealNote', i) as string, - } as IDataObject + } as IDataObject; const dealId = this.getNodeParameter('dealId', i) as number; endpoint = `/api/3/deals/${dealId}/notes`; @@ -356,11 +358,11 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- // deal:updateNote // ---------------------------------- - requestMethod = 'PUT' + requestMethod = 'PUT'; body.note = { note: this.getNodeParameter('dealNote', i) as string, - } as IDataObject + } as IDataObject; const dealId = this.getNodeParameter('dealId', i) as number; const dealNoteId = this.getNodeParameter('dealNoteId', i) as number; @@ -480,7 +482,7 @@ export class ActiveCampaign implements INodeType { const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; if (additionalFields.acceptsMarketing !== undefined) { - if (additionalFields.acceptsMarketing == true) { + if (additionalFields.acceptsMarketing === true) { additionalFields.acceptsMarketing = '1'; } else { additionalFields.acceptsMarketing = '0'; @@ -501,8 +503,8 @@ export class ActiveCampaign implements INodeType { body.ecomCustomer = {} as IDataObject; const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; - if (updateFields.acceptsMarketing != undefined) { - if (updateFields.acceptsMarketing == true) { + if (updateFields.acceptsMarketing !== undefined) { + if (updateFields.acceptsMarketing === true) { updateFields.acceptsMarketing = '1'; } else { updateFields.acceptsMarketing = '0'; @@ -587,9 +589,6 @@ export class ActiveCampaign implements INodeType { throw new Error(`The operation "${operation}" is not known`); } - console.log(endpoint); - console.log(body) - } else { throw new Error(`The resource "${resource}" is not known!`); } From 7da53ad943a4692905889fe8c119f34795f28ea0 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sun, 3 Nov 2019 21:49:49 +0100 Subject: [PATCH 38/66] more tslint changes --- .../nodes-base/nodes/ActiveCampaign/ContactDescription.ts | 4 ++-- packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts | 4 ++-- .../nodes/ActiveCampaign/EcomCustomerDescription.ts | 4 ++-- .../nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts | 4 ++-- .../nodes/ActiveCampaign/EcomOrderProductsDescription.ts | 4 ++-- packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts | 4 ++-- packages/nodes-base/nodes/ActiveCampaign/currencies.ts | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts index b44482450..02c699e4b 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts @@ -42,7 +42,7 @@ export const contactOperations = [ default: 'create', description: 'The operation to perform.', }, -] as INodeProperties[] +] as INodeProperties[]; export const contactFields = [ // ---------------------------------- @@ -348,4 +348,4 @@ export const contactFields = [ default: 100, description: 'How many results to return.', }, -] as INodeProperties[] +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts index 03ffc386d..dac1b0aa3 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts @@ -55,7 +55,7 @@ export const dealOperations = [ description: 'The operation to perform.', }, -] as INodeProperties[] +] as INodeProperties[]; export const dealFields = [ // ---------------------------------- @@ -526,4 +526,4 @@ export const dealFields = [ description: 'The content of the deal note', }, -] as INodeProperties[] \ No newline at end of file +] as INodeProperties[]; \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts index 53842df99..78c09afad 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts @@ -42,7 +42,7 @@ export const ecomCustomerOperations = [ default: 'create', description: 'The operation to perform.', }, -] as INodeProperties[] +] as INodeProperties[]; export const ecomCustomerFields = [ // ---------------------------------- @@ -287,4 +287,4 @@ export const ecomCustomerFields = [ default: 100, description: 'How many results to return.', }, -] as INodeProperties[] +] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts index 968898e21..a1c0993df 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts @@ -44,7 +44,7 @@ export const ecomOrderOperations = [ default: 'create', description: 'The operation to perform.', }, -] as INodeProperties[] +] as INodeProperties[]; export const ecomOrderFields = [ // ---------------------------------- @@ -713,4 +713,4 @@ export const ecomOrderFields = [ default: 100, description: 'How many results to return.', }, -] as INodeProperties[] \ No newline at end of file +] as INodeProperties[]; \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts index fbff8787d..29869a743 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts @@ -32,7 +32,7 @@ export const ecomOrderProductsOperations = [ default: 'getAll', description: 'The operation to perform.', }, -] as INodeProperties[] +] as INodeProperties[]; export const ecomOrderProductsFields = [ // ---------------------------------- @@ -121,4 +121,4 @@ export const ecomOrderProductsFields = [ default: 100, description: 'How many results to return.', }, -] as INodeProperties[] \ No newline at end of file +] as INodeProperties[]; \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts b/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts index 769effe9e..fe607b80b 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/GenericFunctions.ts @@ -105,12 +105,12 @@ export async function activeCampaignApiRequestAllItems(this: IHookFunctions | IE if (dataKey === undefined) { returnData.push.apply(returnData, responseData); - if (returnData != undefined) { + if (returnData !== undefined) { itemsReceived += returnData.length; } } else { returnData.push.apply(returnData, responseData[dataKey]); - if (responseData[dataKey] != undefined) { + if (responseData[dataKey] !== undefined) { itemsReceived += responseData[dataKey].length; } } diff --git a/packages/nodes-base/nodes/ActiveCampaign/currencies.ts b/packages/nodes-base/nodes/ActiveCampaign/currencies.ts index 194864f72..e979999ee 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/currencies.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/currencies.ts @@ -170,4 +170,4 @@ export const allCurrencies = [ { name: 'South African Rand', value: 'zar' }, { name: 'Zambian Kwacha', value: 'zmw' }, { name: 'Zimbabwean Dollar', value: 'zwl' } -] +]; From e02946817103007145617e9df3625c45d81db266 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sun, 3 Nov 2019 22:17:43 +0100 Subject: [PATCH 39/66] add connection description --- .../ActiveCampaign/ActiveCampaign.node.ts | 101 +++++- .../ActiveCampaign/ConnectionDescription.ts | 324 ++++++++++++++++++ .../ActiveCampaign/ContactDescription.ts | 10 +- .../nodes/ActiveCampaign/DealDescription.ts | 4 +- .../ActiveCampaign/EcomCustomerDescription.ts | 6 +- 5 files changed, 434 insertions(+), 11 deletions(-) create mode 100644 packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 0b63c45a0..1ae440fd0 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -34,7 +34,16 @@ import { ecomCustomerOperations, ecomCustomerFields } from './EcomCustomerDescription'; -import { ecomOrderProductsOperations, ecomOrderProductsFields } from './EcomOrderProductsDescription'; + +import { + ecomOrderProductsOperations, + ecomOrderProductsFields +} from './EcomOrderProductsDescription'; + +import { + connectionOperations, + connectionFields +} from './ConnectionDescription'; interface CustomProperty { name: string; @@ -98,6 +107,10 @@ export class ActiveCampaign implements INodeType { name: 'Deal', value: 'deal', }, + { + name: 'Connection', + value: 'connection' + } { name: 'E-commerce Order', value: 'ecommerceOrder', @@ -120,10 +133,14 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- ...contactOperations, ...dealOperations, + ...connectionOperations, ...ecomOrderOperations, ...ecomCustomerOperations, ...ecomOrderProductsOperations, + // ---------------------------------- + // fields + // ---------------------------------- // ---------------------------------- // contact // ---------------------------------- @@ -134,6 +151,11 @@ export class ActiveCampaign implements INodeType { // ---------------------------------- ...dealFields, + // ---------------------------------- + // connection + // ---------------------------------- + ...connectionFields, + // ---------------------------------- // ecommerceOrder // ---------------------------------- @@ -368,6 +390,83 @@ export class ActiveCampaign implements INodeType { const dealNoteId = this.getNodeParameter('dealNoteId', i) as number; endpoint = `/api/3/deals/${dealId}/notes/${dealNoteId}`; + } else { + throw new Error(`The operation "${operation}" is not known`); + } + } else if (resource === 'connection') { + if (operation === 'create') { + // ---------------------------------- + // connection:create + // ---------------------------------- + + requestMethod = 'POST'; + + const updateIfExists = this.getNodeParameter('updateIfExists', i) as boolean; + if (updateIfExists === true) { + endpoint = '/api/3/connection/sync'; + } else { + endpoint = '/api/3/connections'; + } + + dataKey = 'connection'; + + body.connection = { + email: this.getNodeParameter('email', i) as string, + } as IDataObject; + + const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; + addAdditionalFields(body.connection as IDataObject, additionalFields); + + } else if (operation === 'delete') { + // ---------------------------------- + // connection:delete + // ---------------------------------- + + requestMethod = 'DELETE'; + + const connectionId = this.getNodeParameter('connectionId', i) as number; + endpoint = `/api/3/connections/${connectionId}`; + + } else if (operation === 'get') { + // ---------------------------------- + // connection:get + // ---------------------------------- + + requestMethod = 'GET'; + + const connectionId = this.getNodeParameter('connectionId', i) as number; + endpoint = `/api/3/connections/${connectionId}`; + + } else if (operation === 'getAll') { + // ---------------------------------- + // connections:getAll + // ---------------------------------- + + requestMethod = 'GET'; + + returnAll = this.getNodeParameter('returnAll', i) as boolean; + if (returnAll === false) { + qs.limit = this.getNodeParameter('limit', i) as number; + } + + dataKey = 'connections'; + endpoint = `/api/3/connections`; + + } else if (operation === 'update') { + // ---------------------------------- + // connection:update + // ---------------------------------- + + requestMethod = 'PUT'; + + const connectionId = this.getNodeParameter('connectionId', i) as number; + endpoint = `/api/3/connections/${connectionId}`; + + dataKey = 'connection'; + body.connection = {} as IDataObject; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + addAdditionalFields(body.connection as IDataObject, updateFields); + } else { throw new Error(`The operation "${operation}" is not known`); } diff --git a/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts new file mode 100644 index 000000000..f8c7d1ede --- /dev/null +++ b/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts @@ -0,0 +1,324 @@ +import { INodeProperties } from "n8n-workflow"; + +import { allCurrencies } from './currencies'; + +export const connectionOperations = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'connection', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a connection', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a connection', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a connection', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all connections', + }, + { + name: 'Update', + value: 'update', + description: 'Update a connection', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, + +] as INodeProperties[]; + +export const connectionFields = [ + // ---------------------------------- + // connection:create + // ---------------------------------- + { + displayName: 'Service', + name: 'service', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'connection', + ], + }, + }, + description: 'The name of the service.', + }, + { + displayName: 'External accout ID', + name: 'externalid', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'connection', + ], + }, + }, + description: 'The id of the account in the external service.', + }, + { + displayName: 'Account Name', + name: 'name', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'connection', + ], + }, + }, + description: 'The name associated with the account in the external service. Often this will be a company name (e.g., "My Toystore, Inc.").', + }, + { + displayName: 'Logo URL', + name: 'logoUrl', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'connection', + ], + }, + }, + description: 'The URL to a logo image for the external service.', + }, + { + displayName: 'Link URL', + name: 'linkUrl', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'connection', + ], + }, + }, + description: 'The URL to a page where the integration with the external service can be managed in the third-party\'s website.', + }, + + // ---------------------------------- + // connection:update + // ---------------------------------- + { + displayName: 'Connection ID', + name: 'connectionId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'connection', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the connection to update.', + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + description: 'The fields to update.', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'connection', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Service', + name: 'service', + type: 'string', + default: '', + description: 'The name of the service.', + }, + { + displayName: 'External accout ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the account in the external service.', + }, + { + displayName: 'Account Name', + name: 'name', + type: 'string', + default: '', + description: 'The name associated with the account in the external service. Often this will be a company name (e.g., "My Toystore, Inc.").', + }, + { + displayName: 'Logo URL', + name: 'logoUrl', + type: 'string', + default: '', + description: 'The URL to a logo image for the external service.', + }, + { + displayName: 'Link URL', + name: 'linkUrl', + type: 'string', + default: '', + description: 'The URL to a page where the integration with the external service can be managed in the third-party\'s website.', + }, + { + displayName: 'Status', + name: 'status', + type: 'number', + default: 1, + description: 'The status of the connection (0 = error; 1 = connected)', + }, + { + displayName: 'Syncronisation Status', + name: 'syncStatus', + type: 'number', + default: 1, + description: 'The status of a sync triggered on the connection (0 = sync stopped; 1 = sync running).', + }, + ] + }, + + // ---------------------------------- + // connection:delete + // ---------------------------------- + { + displayName: 'Connection ID', + name: 'connectionId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'connection', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the connection to delete.', + }, + + // ---------------------------------- + // connection:get + // ---------------------------------- + { + displayName: 'Connection ID', + name: 'connectionId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'connection', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the connection to get.', + }, + + // ---------------------------------- + // connection:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'connection', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'connection', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, +] as INodeProperties[]; \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts index 02c699e4b..8b7a264c0 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts @@ -64,7 +64,7 @@ export const contactFields = [ ], }, }, - description: 'The email of the contact to create', + description: 'The email of the contact to create.', }, { displayName: 'Update if exists', @@ -105,14 +105,14 @@ export const contactFields = [ name: 'firstName', type: 'string', default: '', - description: 'The first name of the contact to create', + description: 'The first name of the contact to create.', }, { displayName: 'Last Name', name: 'lastName', type: 'string', default: '', - description: 'The last name of the contact to create', + description: 'The last name of the contact to create.', }, { displayName: 'Phone', @@ -208,14 +208,14 @@ export const contactFields = [ name: 'firstName', type: 'string', default: '', - description: 'First name of the contact', + description: 'First name of the contact.', }, { displayName: 'Last Name', name: 'lastName', type: 'string', default: '', - description: 'Last name of the contact', + description: 'Last name of the contact.', }, { displayName: 'Phone', diff --git a/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts index dac1b0aa3..e5219177d 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts @@ -359,7 +359,7 @@ export const dealFields = [ ], }, }, - description: 'The ID of the deal', + description: 'The ID of the deal to delete.', }, // ---------------------------------- @@ -381,7 +381,7 @@ export const dealFields = [ ], }, }, - description: 'The ID of the deal', + description: 'The ID of the deal to get.', }, // ---------------------------------- diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts index 78c09afad..f7f75e3fb 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts @@ -148,7 +148,7 @@ export const ecomCustomerFields = [ }, default: 0, required: true, - description: 'ID of the ecommerceCustomer to update.', + description: 'ID of the E-commerce customer to update.', }, { displayName: 'Update Fields', @@ -218,7 +218,7 @@ export const ecomCustomerFields = [ }, default: 0, required: true, - description: 'ID of the ecommerceCustomer to update.', + description: 'ID of the E-commerce customer to delete.', }, // ---------------------------------- @@ -240,7 +240,7 @@ export const ecomCustomerFields = [ }, default: 0, required: true, - description: 'ID of the ecommerceCustomer to update.', + description: 'ID of the E-commerce customer to get.', }, // ---------------------------------- From 5ca63830482931ec81ab3ff5e824eb026ac2282d Mon Sep 17 00:00:00 2001 From: quansenB Date: Sun, 3 Nov 2019 22:25:45 +0100 Subject: [PATCH 40/66] add deepdata integration connection support --- .../ActiveCampaign/ActiveCampaign.node.ts | 51 +++++++++---------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts index 1ae440fd0..a7b47f6e2 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ActiveCampaign.node.ts @@ -110,7 +110,7 @@ export class ActiveCampaign implements INodeType { { name: 'Connection', value: 'connection' - } + }, { name: 'E-commerce Order', value: 'ecommerceOrder', @@ -272,7 +272,9 @@ export class ActiveCampaign implements INodeType { endpoint = `/api/3/contacts/${contactId}`; dataKey = 'contact'; + body.contact = {} as IDataObject; + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; addAdditionalFields(body.contact as IDataObject, updateFields); @@ -401,21 +403,30 @@ export class ActiveCampaign implements INodeType { requestMethod = 'POST'; - const updateIfExists = this.getNodeParameter('updateIfExists', i) as boolean; - if (updateIfExists === true) { - endpoint = '/api/3/connection/sync'; - } else { - endpoint = '/api/3/connections'; - } - - dataKey = 'connection'; + endpoint = '/api/3/connections'; body.connection = { - email: this.getNodeParameter('email', i) as string, + service: this.getNodeParameter('service', i) as string, + externalid: this.getNodeParameter('externalid', i) as string, + name: this.getNodeParameter('name', i) as string, + logoUrl: this.getNodeParameter('logoUrl', i) as string, + linkUrl: this.getNodeParameter('linkUrl', i) as string, } as IDataObject; - const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject; - addAdditionalFields(body.connection as IDataObject, additionalFields); + } else if (operation === 'update') { + // ---------------------------------- + // connection:update + // ---------------------------------- + + requestMethod = 'PUT'; + + const connectionId = this.getNodeParameter('connectionId', i) as number; + endpoint = `/api/3/connections/${connectionId}`; + + body.connection = {} as IDataObject; + + const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; + addAdditionalFields(body.connection as IDataObject, updateFields); } else if (operation === 'delete') { // ---------------------------------- @@ -449,24 +460,8 @@ export class ActiveCampaign implements INodeType { qs.limit = this.getNodeParameter('limit', i) as number; } - dataKey = 'connections'; endpoint = `/api/3/connections`; - } else if (operation === 'update') { - // ---------------------------------- - // connection:update - // ---------------------------------- - - requestMethod = 'PUT'; - - const connectionId = this.getNodeParameter('connectionId', i) as number; - endpoint = `/api/3/connections/${connectionId}`; - - dataKey = 'connection'; - body.connection = {} as IDataObject; - const updateFields = this.getNodeParameter('updateFields', i) as IDataObject; - addAdditionalFields(body.connection as IDataObject, updateFields); - } else { throw new Error(`The operation "${operation}" is not known`); } From baf46f4d89ebb41ae1227dbde4422e0ed91a6d5a Mon Sep 17 00:00:00 2001 From: quansenB Date: Mon, 4 Nov 2019 00:00:59 +0100 Subject: [PATCH 41/66] finish connections work --- .../nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts index f8c7d1ede..a3844fb11 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts @@ -243,7 +243,7 @@ export const connectionFields = [ displayOptions: { show: { operation: [ - 'update', + 'delete', ], resource: [ 'connection', @@ -265,7 +265,7 @@ export const connectionFields = [ displayOptions: { show: { operation: [ - 'update', + 'get', ], resource: [ 'connection', From 6c1d1ade1458a6516b77030dc481ef873d7aae52 Mon Sep 17 00:00:00 2001 From: quansenB Date: Mon, 4 Nov 2019 00:21:57 +0100 Subject: [PATCH 42/66] tslint proof allcureencies file --- packages/nodes-base/nodes/utils/allCurrencies.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/utils/allCurrencies.ts b/packages/nodes-base/nodes/utils/allCurrencies.ts index 3fd41695d..2924edc32 100644 --- a/packages/nodes-base/nodes/utils/allCurrencies.ts +++ b/packages/nodes-base/nodes/utils/allCurrencies.ts @@ -1,4 +1,4 @@ -[ +const allCurrencies = [ { name: 'Euro', value: 'eur' }, { name: 'United States Dollar', value: 'usd' }, { name: 'British Pound Sterling', value: 'gbp' }, @@ -170,4 +170,5 @@ { name: 'South African Rand', value: 'zar' }, { name: 'Zambian Kwacha', value: 'zmw' }, { name: 'Zimbabwean Dollar', value: 'zwl' } +// tslint:disable-next-line: semicolon ] \ No newline at end of file From 247954c0fa9ff36d2a14ef1bcc0376bf0bd5b082 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Wed, 6 Nov 2019 19:58:18 -0500 Subject: [PATCH 43/66] freshdesk-node-setup --- .../credentials/FreshdeskApi.credentials.ts | 18 ++++++ .../nodes/Freshdesk/Freskdesk.node.ts | 56 ++++++++++++++++++ .../nodes/Freshdesk/GenericFunctions.ts | 52 ++++++++++++++++ .../nodes-base/nodes/Freshdesk/freshdesk.png | Bin 0 -> 4956 bytes packages/nodes-base/package.json | 6 +- 5 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 packages/nodes-base/credentials/FreshdeskApi.credentials.ts create mode 100644 packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts create mode 100644 packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts create mode 100644 packages/nodes-base/nodes/Freshdesk/freshdesk.png diff --git a/packages/nodes-base/credentials/FreshdeskApi.credentials.ts b/packages/nodes-base/credentials/FreshdeskApi.credentials.ts new file mode 100644 index 000000000..0f06b4e35 --- /dev/null +++ b/packages/nodes-base/credentials/FreshdeskApi.credentials.ts @@ -0,0 +1,18 @@ +import { + ICredentialType, + NodePropertyTypes, +} from 'n8n-workflow'; + + +export class FreshdeskApi implements ICredentialType { + name = 'freshdeskApi'; + displayName = 'Freshdesk API'; + properties = [ + { + displayName: 'API Key', + name: 'apiKey', + type: 'string' as NodePropertyTypes, + default: '', + }, + ]; +} diff --git a/packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts b/packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts new file mode 100644 index 000000000..d03991448 --- /dev/null +++ b/packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts @@ -0,0 +1,56 @@ +import { + IExecuteSingleFunctions, +} from 'n8n-core'; +import { + IDataObject, + INodeTypeDescription, + INodeExecutionData, + INodeType, + ILoadOptionsFunctions, + INodePropertyOptions, +} from 'n8n-workflow'; +import { + freshdeskApiRequest +} from './GenericFunctions'; + +import moment = require('moment'); +import _ = require('lodash') + +export class Freshdesk implements INodeType { + + description: INodeTypeDescription = { + displayName: 'Freshdesk', + name: 'freshdesk', + icon: 'file:freshdesk.png', + group: ['output'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Consume Freshdesk API', + defaults: { + name: 'Freshdesk', + color: '#c02428', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'freshdeskApi', + required: true, + } + ], + properties: [ + ] + }; + + + methods = { + loadOptions: { + } + }; + + // async executeSingle(this: IExecuteSingleFunctions): Promise { + + + + // } +} diff --git a/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts new file mode 100644 index 000000000..a967f44b9 --- /dev/null +++ b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts @@ -0,0 +1,52 @@ +import { OptionsWithUri } from 'request'; + +import { + IExecuteFunctions, + IHookFunctions, + ILoadOptionsFunctions, + IExecuteSingleFunctions +} from 'n8n-core'; + +import * as _ from 'lodash'; +import { IDataObject } from 'n8n-workflow'; + +export async function freshdeskApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, resource: string, method: string, action: string, body: any = {}, headers?: object): Promise { // tslint:disable-line:no-any + const credentials = this.getCredentials('mandrillApi'); + + if (credentials === undefined) { + throw new Error('No credentials got returned!'); + } + + const data = Object.assign({}, body, { key: credentials.apiKey }); + + const endpoint = 'mandrillapp.com/api/1.0'; + + const options: OptionsWithUri = { + headers, + method, + uri: `https://${endpoint}${resource}${action}.json`, + body: data, + json: true + }; + + + try { + return await this.helpers.request!(options); + } catch (error) { + console.error(error); + + const errorMessage = error.response.body.message || error.response.body.Message; + if (error.name === 'Invalid_Key') { + throw new Error('The provided API key is not a valid Mandrill API key'); + } else if (error.name === 'ValidationError') { + throw new Error('The parameters passed to the API call are invalid or not provided when required'); + } else if (error.name === 'GeneralError') { + throw new Error('An unexpected error occurred processing the request. Mandrill developers will be notified.'); + } + + if (errorMessage !== undefined) { + throw errorMessage; + } + throw error.response.body; + } +} diff --git a/packages/nodes-base/nodes/Freshdesk/freshdesk.png b/packages/nodes-base/nodes/Freshdesk/freshdesk.png new file mode 100644 index 0000000000000000000000000000000000000000..36692057e456cb3763124a1d9ac216fd6c4b01a8 GIT binary patch literal 4956 zcmY*dWmptiyB#E@LqI^JL2_sW>5icpLIfFN$bkWdMv(6A?h+)F<^T@ejkLrdr8Gzi zAD(mWckkWL^X^!Cy=(1v?|(Z&OGAkOml_uU01&7s%j-Oh;(r1M>!BCBU2u6AFsxIJ{d3=EIuaLRm*00Pto70Nw`!0M`%D`yBwljTZpeGkeHN2LLGH*{#}tgdW3{ zja&f$3YI^CrlP}q1OT8J+3Fc04Antm7EUl8h^3Rc6^|zj{=j}P_7r=V!mJPwdQX^x zqpO&w1moWfv4{B|7|2NfHw9rY!Dy(iMK9;%Vnr{+Bgn(cD2Yo?PcQCb2^G_kSNu2q zVI{$6gFwK=fItrq4;~Kz9w!%TAfKqHD3F&Q$j{IHz~FZEazsEpxgA}Z{t@{f9eFEP z3m02B!q&-={*Nxi+{q0g!N~Z>=)disb0Tb^|Lf%F`fphe1p@!<0Qq=$f&bNhNEQEs zifOvoT0J=b(U;^C|C{;$uz!8Tfq%^Z&td+l^l$W`R7qTM;D4`85*O6PW&{9`z*OXA z^lUIkjq%`bX1(s}o!Z|vat)_)5BIH6`mHH32y2DSvm#+Tg6j0TucwkrrxD6n%4)J< zma6?@6QL@~OBifVrl6Sx`}pjG#5B5Jn$cg1b1^Y34Sce^Vi^2XHS5{{Jii%R`P`PM zznH>RdL`6$anQbfyX~KMFSY%`Dfzuopthl&*FY9awtxa^f(xBdrNn#4B<=0FNmg;wczPd?PQK54tUyfVECAPbnPu;wLqVgk>Fl zU2LBhcXIorGDb~NaO{ciNI4n`KT+kp`?${{?!F699}MHZqkhsVzEiS*rBq}ICM`)E zWhgiy0*oZBrG5?91xtHh2w9Pi#=M$u)M|Hk3!h`i%FZ=F~8>9Qa#aOOg(BVko;-!g0K>H#5|_IY}S1q zh*eazEdd<3c<}gwB~N3hR?xnXn&lk2ebam#bf^t;UREXRAf{6c9(ZJ_54tPm%iQGg zN-E?nQh8N3lTjOo5Z>rRX=>>>I-HIojWTP_4%BUgB2GolS$iuBc#A^Gi!J-qCAjCO z&f@xr8ogDWV*>`|6fsdp>DEc_2J4xbY3f2`I%5WpIn;(;cy+Ydt(ooCYnaWCeKwJk zxEzY`X8?CMFBqtg64HFs2m|nKvT&B1F#$237SRid^eYFXRc{!Cqrk4`0I5ex+0#^3 z-mre&D*6(eXY0NDO>f^3&A!6a!j>NP~09N~MPDXc_1P)l^+S zqyFkg>v6fgZqh14Wg;8lAPgz1wd`~i%!X$+-bFPZb^+@mU18Q-7<3r}!s!D%^hR=L z?OOv@w^avmM++sd`l6Rb5gEHHwt~NMkP8zm!8@J32Y|iP%DPeqcKuJ$oadAol5+;8 zLDq9p@136eV`=_+j)boIZf!jwUL6Z{@)6t~vc|v$K0_;%DE~Fu8#WnWX$~=kUMBKd z_C@xM&J1+Utq6n~&GwBqwMR;I95M2`#Fl0r`i?L^!EB|fA5*OT2*>O&^}%ig&X2fE zMMX+Ker|lq7A`1%9Mpm3Z~`tc_`by@Jr&j_*M50ZJy$!>1X$t!{;ZzUKYsi<(`SDX z4{XUMgmq%Ez`Jed`{Q?>1^2X7I9$EAUEuJEXeQFQjP27M9v(8{w-Ff5KGPPS&D+zS zHoYc@AX42GUyI&t=QA6&Z_#Jw=xQ2ZNFR1m5$L|ps^RADJ2V?72dR?^ZegTA_P>;J zIyOMz4Ie1Sej5VRU+pv5kT?yEpC^^8#Z+Cz19v{&`UF=Lm}fu2wXk zR@0ujSc#BtB-OFR6cnS~O%$stY=i}I)P(TA9C%Wh%@b+ZY>vO%uMh|}ZEPaq3F^c? za7+$$1qr>G+G?dB8c{Odh7zL{;nUE8MXAv&djtsdb zA(h8PoHeNaQ6Mj6{vcW7*xN8*N|jZ?l+)I3<+(*ST=PYE9u|%EA-hsMngWIudP)H0 zi}Tqtpt=MFVYW|D^S3W!(zMh}?^wMx!8BPfrAvj-Dqbuk`x89>d5QV04bhd)b%asd zW+!l%5~EO-0x-&)stH~H6+kE$1~ijo+U6y(wodE&qA!z)vR2h+X;_k2j-oU5ogG=1 z$>jdsyEX*n_6F|1)jrb~R;2Taw=PTM8|yWwj0UWBA- zjKeVy^Jlck#i?uNz0?lZH(y>wz(8bewx!b*2TwTxN{r@!uI`*kJIY(A~n2RJ4tPjGOe=L-J*6>GdMYNFeIW zO?WvXN^S)C*sm$hRk)uoWA5zu^)rOnysnN%K`q;tO>X~!fu_5w0TXX z%ADg0M;E=6l>cxRdcDRhyC;HMQb3VivYug9|1`T&$(U}xPG*MR3Eb{2v=%;OG;m6q z;A>c#gQtI$TG&#}4-08SOl}7T<$MZcqlhbt+S2WM&(H~?v;6dpT3ok{q!oMPH*1BB z{_kOZyk@9LkErK|H-;ehy2BLtYnw(Va~WKFhX6h*iD|D~5O>)$dyY{hw(WPdxm%tC zqfb%O2}M>RY46JJX;yzq2A@a&3yW=4H9>zJLf#{&lQHYbs~h}W z=QH@uMUOY^D;sS#zYeqJ&%AGrx9t`od)?l-$k{+OhR)O$hgayaKBYP!v!o_frpWn6 z1Rso~13(ujhI7!css=|zCETV(MIqEmVAfqcHKG$nM}{|Gkda0riN=#+(a@p87&p-) zKabEd790b=j=%bzAQOP)E|^5XMx}3UHoAw2vm8&7s;Bd1lm*dIrs+4&{7Qa_PHkS1(_apUkklIoR0CY%m>)x3enc58%Kf-zSGhD<(!)x)O3F zsaC2?=bD@?4HLK{E4Nqsq%PXySe6S@-fDzsANJIf70Au&`Q>OaBYCT^nnsM&qz*)u z=o)oDfkSCnt}2b-&u~n7m|`@GSUkt-6KfW9A9ejmC>HJA@e^mxJ8qxb=iO#V>MDp6 zydAoFi~5$D*EL>eSxPOk;3O`4r|($$F=rZ-MtMbvYCRE~R(&)Ro$#jNjc#3Z6if}& z?P6zSwWt>!qR@tJ-)?mY@n#7UYq_!+%)6RGp=#iPr39965-FD>gw#5j#5`hLaMBToAKa+GqHy= z%Y(1IHLhzBy%-~dz;1MK(^{0Zf1o{Xb#KbEG}{J}Mx=3o2m7Sc8!?;7M9nFy5L^62`(J|5v9@xd+vm(sZEW>b^HWA%6W5_syI?c zj_+b6PqV(Xy<&!8nN42+cs@9h7*TYvWY_GDSf|_xCzwu?Se_l`(I%5IxSZre zXIogq3rw|Y&|uj8!L({1J*foBvKEZcgu{N4_Dk$lcje$ULf(s>cNFMjW!v%m4yIBq z!&;xTE%1iM)Pyb`X?+*YJSCl0*>d0>n}m1SQc{lh>k8#{y@QRfHFl-EObJRAiqDVB z)R%@+0BHC3ydE_;5`11Pu~`!nC=^#yfW6GmeL{IUf_)3m)<>Ly$W0Wd22Ms$apf5u{xM?44LGXha4+yKXPspf zT)5C^%J8*!%{DX?oppIP>Au=B%anLkL2xV)Grlo7_LfzoMN`%+?qtH`FleD za5lR;z=i8DSoV`|^r27yM5s3NYe8yC|MRj<)cnxZFLAu+g$V>lamm1>03W^LXWQ9{ zfyP2Bp6%`K0)5|>Th^Z~cal%MPDeNLOx}QE)|M9x1-4qqdNvG^^e0~=TdeG{v6Socb={qfF_59x?v5@$umz~Bfx@Yz*> zMqx+YUZtg2=$uzFgoLQ1T(|KFaN5k^1~d{I&q|wGkx$h*mV|qeT-ELI^_FUDGc9XK zy<%4{ezF*bozaLWQ1Ka=lygkBRnj^wihUj#4}#hqzuBL)1NY}pxZGE!p@d!RFKV_9 zy5^emsy39Y?1Z5T{mJ;10lFvby3T}Yl74%l;$Bx)Ggp+ZO?AZEMmmc@z|W)2-7h{y z1lCwy8_AIQc@+oA6QKH|4!Tyo^S;>)-Gm(X zyL9W^V+pWB$l0ubWj)LCn8HsE@isFNN$^eGCT^&{5{!MwQB-CO-`HXIG;43R@`@5* zt2-Uf&kGj4wlUqeCOr|>HI@e!^}LPh--h+aW^zwVvIcOC6-U=M?{?KweFeC)_v_P} z`?lV1LWDT(XX=WRs*(}DUC)#(Rj$fKD)>d zAn8xdY-;5DH*abTdTX)x{FKS2mjzAtJ_RFpc&|N8)y`ojbPe;vEM&hfNAFztF5)9w zUgfW%AdOEOJZmx`QOX7x73e4 Date: Thu, 7 Nov 2019 01:06:19 -0500 Subject: [PATCH 44/66] UI changes --- .../credentials/FreshdeskApi.credentials.ts | 17 +- .../nodes/Freshdesk/Freshdesk.node.ts | 454 ++++++++++++++++++ .../nodes/Freshdesk/Freskdesk.node.ts | 56 --- .../nodes/Freshdesk/GenericFunctions.ts | 30 +- 4 files changed, 484 insertions(+), 73 deletions(-) create mode 100644 packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts delete mode 100644 packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts diff --git a/packages/nodes-base/credentials/FreshdeskApi.credentials.ts b/packages/nodes-base/credentials/FreshdeskApi.credentials.ts index 0f06b4e35..26e0e4f31 100644 --- a/packages/nodes-base/credentials/FreshdeskApi.credentials.ts +++ b/packages/nodes-base/credentials/FreshdeskApi.credentials.ts @@ -9,10 +9,23 @@ export class FreshdeskApi implements ICredentialType { displayName = 'Freshdesk API'; properties = [ { - displayName: 'API Key', - name: 'apiKey', + displayName: 'Username', + name: 'username', type: 'string' as NodePropertyTypes, default: '', + }, + { + displayName: 'Password', + name: 'password', + type: 'password' as NodePropertyTypes, + default: '', + }, + { + displayName: 'Domain', + name: 'domain', + type: 'string' as NodePropertyTypes, + default: '', + placeholder: 'https://domain.freshdesk.com' }, ]; } diff --git a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts new file mode 100644 index 000000000..68e155908 --- /dev/null +++ b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts @@ -0,0 +1,454 @@ +import { + IExecuteSingleFunctions, +} from 'n8n-core'; +import { + IDataObject, + INodeTypeDescription, + INodeExecutionData, + INodeType, + ILoadOptionsFunctions, + INodePropertyOptions, +} from 'n8n-workflow'; +import { + freshdeskApiRequest +} from './GenericFunctions'; + +import moment = require('moment'); +import _ = require('lodash') + +enum Status { + Open = 1, + Pending = 2, + Resolved = 3, + Closed = 4 +} + +enum Priority { + Low = 1, + Medium = 2, + High = 3, + Urgent = 4 +} + +interface ICreateTicketBody { + name?: string; + requester_id?: number; + email?: string; + facebook_id?: string; + phone?: string; + twitter_id?: string; + unique_external_id?: string, + subject?: string, + type?: string, + status: Status, + priority: Priority, + description?: string, + responder_id?: number, + cc_emails?: [string]; + custom_fields?: IDataObject; + due_by?: string; + email_config_id?: number; + fr_due_by?: string; + group_id?: number; + product_id?: number; + source: number; + tags: [string]; + company_id: number; +} + +export class Freshdesk implements INodeType { + + description: INodeTypeDescription = { + displayName: 'Freshdesk', + name: 'freshdesk', + icon: 'file:freshdesk.png', + group: ['output'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Consume Freshdesk API', + defaults: { + name: 'Freshdesk', + color: '#c02428', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'freshdeskApi', + required: true, + } + ], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + required: true, + options: [ + { + name: 'Ticket', + value: 'ticket', + }, + ], + default: 'ticket', + description: 'The resource to operate on.', + }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ] + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a new ticket', + } + ], + default: 'create', + description: 'The operation to perform.', + }, + { + displayName: 'Requester Identification', + name: 'requester', + type: 'options', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ], + operation: [ + 'create' + ] + }, + }, + options: [ + { + name: 'Requester Id', + value: 'requesterId', + description: `User ID of the requester. For existing contacts, the requester_id can be passed instead of the requester's email.`, + }, + { + name: 'Email', + value: 'email', + description: `Email address of the requester. If no contact exists with this email address in Freshdesk, it will be added as a new contact.`, + }, + { + name: 'Facebook Id', + value: 'facebookId', + description: `Facebook ID of the requester. If no contact exists with this facebook_id, then a new contact will be created.`, + }, + { + name: 'Phone', + value: 'phone', + description: `Phone number of the requester. If no contact exists with this phone number in Freshdesk, it will be added as a new contact. If the phone number is set and the email address is not, then the name attribute is mandatory.`, + }, + { + name: 'Twitter Id', + value: 'twitterId', + description: `Twitter handle of the requester. If no contact exists with this handle in Freshdesk, it will be added as a new contact.`, + }, + { + name: 'Unique External Id', + value: 'uniqueExternalId', + description: `External ID of the requester. If no contact exists with this external ID in Freshdesk, they will be added as a new contact.`, + }, + ], + default: 'requesterId', + description: 'Requester Identification', + }, + { + displayName: 'Value', + name: 'requesterIdentificationValue', + type: 'string', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ], + operation: [ + 'create' + ] + }, + }, + default: '', + description: `Value of the identification selected `, + }, + { + displayName: 'Status', + name: 'status', + type: 'options', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ], + operation: [ + 'create' + ] + }, + }, + options: [ + { + name: 'Open', + value: 'open', + }, + { + name: 'Pending', + value: 'pending', + }, + { + name: 'Resolved', + value: 'resolved', + }, + { + name: 'Closed', + value: 'closed', + } + ], + default: 'pending', + description: 'Status', + }, + { + displayName: 'Priority', + name: 'priority', + type: 'options', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ], + operation: [ + 'create' + ] + }, + }, + options: [ + { + name: 'Low', + value: 'low', + }, + { + name: 'Medium', + value: 'medium', + }, + { + name: 'High', + value: 'high', + }, + { + name: 'Urgent', + value: 'urgent', + } + ], + default: 'low', + description: 'Priority', + }, + { + displayName: 'JSON Parameters', + name: 'jsonParameters', + type: 'boolean', + default: false, + description: '', + displayOptions: { + show: { + resource: [ + 'ticket' + ], + operation: [ + 'create', + ] + }, + }, + }, + { + displayName: 'Options', + name: 'options', + type: 'collection', + placeholder: 'Add Option', + default: {}, + displayOptions: { + show: { + resource: [ + 'ticket' + ], + operation: [ + 'create' + ], + }, + }, + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + placeholder: '', + description: 'Name of the requester', + }, + { + displayName: 'Subject', + name: 'subject', + type: 'string', + default: '', + placeholder: '', + description: 'Subject of the ticket.', + }, + { + displayName: 'Type', + name: 'type', + type: 'string', + default: '', + description: 'Helps categorize the ticket according to the different kinds of issues your support team deals with.', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + typeOptions: { + rows: 5, + alwaysOpenEditWindow: true, + }, + description: 'HTML content of the ticket.', + }, + { + displayName: 'Agent', + name: 'agent', + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getAgents' + }, + description: 'ID of the agent to whom the ticket has been assigned', + }, + { + displayName: 'CC Emails', + name: 'ccEmails', + type: 'string', + default: '', + description: `separated by , email addresses added in the 'cc' field of the incoming ticket email`, + }, + ] + }, + { + displayName: 'Custom Fields', + name: 'customFieldsUi', + placeholder: 'Add Custom fields', + type: 'fixedCollection', + default: '', + typeOptions: { + multipleValues: true, + }, + displayOptions: { + show: { + resource: [ + 'ticket' + ], + operation: [ + 'create' + ], + jsonParameters: [ + false, + ], + }, + }, + description: 'Key value pairs containing the names and values of custom fields.', + options: [ + { + name: 'customFieldsValues', + displayName: 'Custom fields', + values: [ + { + displayName: 'Key', + name: 'key', + type: 'string', + default: '', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + }, + ], + }, + ], + }, + { + displayName: 'Custom Fields', + name: 'customFieldsJson', + type: 'json', + typeOptions: { + alwaysOpenEditWindow: true, + }, + displayOptions: { + show: { + resource: [ + 'ticket' + ], + operation: [ + 'create' + ], + jsonParameters: [ + true, + ], + }, + }, + default: '', + placeholder: `{ + "gadget":"Cold Welder" + }`, + description: 'Key value pairs containing the names and values of custom fields.', + }, + ] + }; + + methods = { + loadOptions: { + // Get all the agents to display them to user so that he can + // select them easily + async getAgents(this: ILoadOptionsFunctions): Promise { + const returnData: INodePropertyOptions[] = []; + let agents; + try { + agents = await freshdeskApiRequest.call(this, '/agents', 'GET'); + } catch (err) { + throw new Error(`Mandrill Error: ${err}`); + } + for (const agent of agents) { + const agentName = agent.contact.name; + const agentId = agent.id; + + returnData.push({ + name: agentName, + value: agentId, + }); + } + + return returnData; + } + }, + }; + + + + async executeSingle(this: IExecuteSingleFunctions): Promise { + + return { + json: {} + } + + } +} diff --git a/packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts b/packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts deleted file mode 100644 index d03991448..000000000 --- a/packages/nodes-base/nodes/Freshdesk/Freskdesk.node.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - IExecuteSingleFunctions, -} from 'n8n-core'; -import { - IDataObject, - INodeTypeDescription, - INodeExecutionData, - INodeType, - ILoadOptionsFunctions, - INodePropertyOptions, -} from 'n8n-workflow'; -import { - freshdeskApiRequest -} from './GenericFunctions'; - -import moment = require('moment'); -import _ = require('lodash') - -export class Freshdesk implements INodeType { - - description: INodeTypeDescription = { - displayName: 'Freshdesk', - name: 'freshdesk', - icon: 'file:freshdesk.png', - group: ['output'], - version: 1, - subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', - description: 'Consume Freshdesk API', - defaults: { - name: 'Freshdesk', - color: '#c02428', - }, - inputs: ['main'], - outputs: ['main'], - credentials: [ - { - name: 'freshdeskApi', - required: true, - } - ], - properties: [ - ] - }; - - - methods = { - loadOptions: { - } - }; - - // async executeSingle(this: IExecuteSingleFunctions): Promise { - - - - // } -} diff --git a/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts index a967f44b9..3a80586c7 100644 --- a/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts @@ -4,31 +4,38 @@ import { IExecuteFunctions, IHookFunctions, ILoadOptionsFunctions, - IExecuteSingleFunctions + IExecuteSingleFunctions, + BINARY_ENCODING } from 'n8n-core'; import * as _ from 'lodash'; import { IDataObject } from 'n8n-workflow'; -export async function freshdeskApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, resource: string, method: string, action: string, body: any = {}, headers?: object): Promise { // tslint:disable-line:no-any - const credentials = this.getCredentials('mandrillApi'); +export async function freshdeskApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, resource: string, method: string, body: any = {}, headers?: object): Promise { // tslint:disable-line:no-any + + const credentials = this.getCredentials('freshdeskApi'); if (credentials === undefined) { throw new Error('No credentials got returned!'); } - const data = Object.assign({}, body, { key: credentials.apiKey }); + const userpass = `${credentials.username}:${credentials.password}` - const endpoint = 'mandrillapp.com/api/1.0'; + const headerWithAuthentication = Object.assign({}, headers, { Authorization: `Basic ${Buffer.from(userpass).toString(BINARY_ENCODING)}` }); + + const endpoint = 'freshdesk.com/api/v2/'; const options: OptionsWithUri = { - headers, + headers: headerWithAuthentication, method, - uri: `https://${endpoint}${resource}${action}.json`, - body: data, + body, + uri: `https://${credentials.domain}.${endpoint}${resource}`, json: true }; + if (_.isEmpty(options.body)) { + delete options.body + } try { return await this.helpers.request!(options); @@ -36,13 +43,6 @@ export async function freshdeskApiRequest(this: IHookFunctions | IExecuteFunctio console.error(error); const errorMessage = error.response.body.message || error.response.body.Message; - if (error.name === 'Invalid_Key') { - throw new Error('The provided API key is not a valid Mandrill API key'); - } else if (error.name === 'ValidationError') { - throw new Error('The parameters passed to the API call are invalid or not provided when required'); - } else if (error.name === 'GeneralError') { - throw new Error('An unexpected error occurred processing the request. Mandrill developers will be notified.'); - } if (errorMessage !== undefined) { throw errorMessage; From 74d1f249810fc6596c7b49b133ec22d203e63567 Mon Sep 17 00:00:00 2001 From: quansenB Date: Thu, 7 Nov 2019 10:50:02 +0100 Subject: [PATCH 45/66] change spaces to tabs --- .../ActiveCampaign/ConnectionDescription.ts | 620 ++++---- .../ActiveCampaign/ContactDescription.ts | 680 ++++---- .../nodes/ActiveCampaign/DealDescription.ts | 1022 ++++++------ .../ActiveCampaign/EcomCustomerDescription.ts | 558 +++---- .../ActiveCampaign/EcomOrderDescription.ts | 1394 ++++++++--------- .../EcomOrderProductsDescription.ts | 230 +-- 6 files changed, 2252 insertions(+), 2252 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts index a3844fb11..2b82d6beb 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts @@ -3,322 +3,322 @@ import { INodeProperties } from "n8n-workflow"; import { allCurrencies } from './currencies'; export const connectionOperations = [ - { - displayName: 'Operation', - name: 'operation', - type: 'options', - displayOptions: { - show: { - resource: [ - 'connection', - ], - }, - }, - options: [ - { - name: 'Create', - value: 'create', - description: 'Create a connection', - }, - { - name: 'Delete', - value: 'delete', - description: 'Delete a connection', - }, - { - name: 'Get', - value: 'get', - description: 'Get data of a connection', - }, - { - name: 'Get All', - value: 'getAll', - description: 'Get data of all connections', - }, - { - name: 'Update', - value: 'update', - description: 'Update a connection', - }, - ], - default: 'create', - description: 'The operation to perform.', - }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'connection', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a connection', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a connection', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a connection', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all connections', + }, + { + name: 'Update', + value: 'update', + description: 'Update a connection', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, ] as INodeProperties[]; export const connectionFields = [ - // ---------------------------------- - // connection:create - // ---------------------------------- - { - displayName: 'Service', - name: 'service', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'connection', - ], - }, - }, - description: 'The name of the service.', - }, - { - displayName: 'External accout ID', - name: 'externalid', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'connection', - ], - }, - }, - description: 'The id of the account in the external service.', - }, - { - displayName: 'Account Name', - name: 'name', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'connection', - ], - }, - }, - description: 'The name associated with the account in the external service. Often this will be a company name (e.g., "My Toystore, Inc.").', - }, - { - displayName: 'Logo URL', - name: 'logoUrl', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'connection', - ], - }, - }, - description: 'The URL to a logo image for the external service.', - }, - { - displayName: 'Link URL', - name: 'linkUrl', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'connection', - ], - }, - }, - description: 'The URL to a page where the integration with the external service can be managed in the third-party\'s website.', - }, + // ---------------------------------- + // connection:create + // ---------------------------------- + { + displayName: 'Service', + name: 'service', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'connection', + ], + }, + }, + description: 'The name of the service.', + }, + { + displayName: 'External accout ID', + name: 'externalid', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'connection', + ], + }, + }, + description: 'The id of the account in the external service.', + }, + { + displayName: 'Account Name', + name: 'name', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'connection', + ], + }, + }, + description: 'The name associated with the account in the external service. Often this will be a company name (e.g., "My Toystore, Inc.").', + }, + { + displayName: 'Logo URL', + name: 'logoUrl', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'connection', + ], + }, + }, + description: 'The URL to a logo image for the external service.', + }, + { + displayName: 'Link URL', + name: 'linkUrl', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'connection', + ], + }, + }, + description: 'The URL to a page where the integration with the external service can be managed in the third-party\'s website.', + }, - // ---------------------------------- - // connection:update - // ---------------------------------- - { - displayName: 'Connection ID', - name: 'connectionId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'connection', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the connection to update.', - }, - { - displayName: 'Update Fields', - name: 'updateFields', - type: 'collection', - description: 'The fields to update.', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'connection', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Service', - name: 'service', - type: 'string', - default: '', - description: 'The name of the service.', - }, - { - displayName: 'External accout ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the account in the external service.', - }, - { - displayName: 'Account Name', - name: 'name', - type: 'string', - default: '', - description: 'The name associated with the account in the external service. Often this will be a company name (e.g., "My Toystore, Inc.").', - }, - { - displayName: 'Logo URL', - name: 'logoUrl', - type: 'string', - default: '', - description: 'The URL to a logo image for the external service.', - }, - { - displayName: 'Link URL', - name: 'linkUrl', - type: 'string', - default: '', - description: 'The URL to a page where the integration with the external service can be managed in the third-party\'s website.', - }, - { - displayName: 'Status', - name: 'status', - type: 'number', - default: 1, - description: 'The status of the connection (0 = error; 1 = connected)', - }, - { - displayName: 'Syncronisation Status', - name: 'syncStatus', - type: 'number', - default: 1, - description: 'The status of a sync triggered on the connection (0 = sync stopped; 1 = sync running).', - }, - ] - }, + // ---------------------------------- + // connection:update + // ---------------------------------- + { + displayName: 'Connection ID', + name: 'connectionId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'connection', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the connection to update.', + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + description: 'The fields to update.', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'connection', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Service', + name: 'service', + type: 'string', + default: '', + description: 'The name of the service.', + }, + { + displayName: 'External accout ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the account in the external service.', + }, + { + displayName: 'Account Name', + name: 'name', + type: 'string', + default: '', + description: 'The name associated with the account in the external service. Often this will be a company name (e.g., "My Toystore, Inc.").', + }, + { + displayName: 'Logo URL', + name: 'logoUrl', + type: 'string', + default: '', + description: 'The URL to a logo image for the external service.', + }, + { + displayName: 'Link URL', + name: 'linkUrl', + type: 'string', + default: '', + description: 'The URL to a page where the integration with the external service can be managed in the third-party\'s website.', + }, + { + displayName: 'Status', + name: 'status', + type: 'number', + default: 1, + description: 'The status of the connection (0 = error; 1 = connected)', + }, + { + displayName: 'Syncronisation Status', + name: 'syncStatus', + type: 'number', + default: 1, + description: 'The status of a sync triggered on the connection (0 = sync stopped; 1 = sync running).', + }, + ] + }, - // ---------------------------------- - // connection:delete - // ---------------------------------- - { - displayName: 'Connection ID', - name: 'connectionId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'connection', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the connection to delete.', - }, + // ---------------------------------- + // connection:delete + // ---------------------------------- + { + displayName: 'Connection ID', + name: 'connectionId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'connection', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the connection to delete.', + }, - // ---------------------------------- - // connection:get - // ---------------------------------- - { - displayName: 'Connection ID', - name: 'connectionId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'connection', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the connection to get.', - }, + // ---------------------------------- + // connection:get + // ---------------------------------- + { + displayName: 'Connection ID', + name: 'connectionId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'connection', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the connection to get.', + }, - // ---------------------------------- - // connection:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'connection', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'connection', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, + // ---------------------------------- + // connection:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'connection', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'connection', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, ] as INodeProperties[]; \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts index 8b7a264c0..25b42b367 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ContactDescription.ts @@ -1,351 +1,351 @@ import { INodeProperties } from "n8n-workflow"; export const contactOperations = [ - { - displayName: 'Operation', - name: 'operation', - type: 'options', - displayOptions: { - show: { - resource: [ - 'contact', - ], - }, - }, - options: [ - { - name: 'Create', - value: 'create', - description: 'Create a contact', - }, - { - name: 'Delete', - value: 'delete', - description: 'Delete a contact', - }, - { - name: 'Get', - value: 'get', - description: 'Get data of a contact', - }, - { - name: 'Get All', - value: 'getAll', - description: 'Get data of all contact', - }, - { - name: 'Update', - value: 'update', - description: 'Update a contact', - }, - ], - default: 'create', - description: 'The operation to perform.', - }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'contact', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a contact', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a contact', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a contact', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all contact', + }, + { + name: 'Update', + value: 'update', + description: 'Update a contact', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, ] as INodeProperties[]; export const contactFields = [ - // ---------------------------------- - // contact:create - // ---------------------------------- - { - displayName: 'Email', - name: 'email', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'contact', - ], - }, - }, - description: 'The email of the contact to create.', - }, - { - displayName: 'Update if exists', - name: 'updateIfExists', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'contact', - ], - }, - }, - default: false, - description: 'Update user if it exists already. If not set and user exists it will error instead.', - }, - { - displayName: 'Additional Fields', - name: 'additionalFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'contact', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'First Name', - name: 'firstName', - type: 'string', - default: '', - description: 'The first name of the contact to create.', - }, - { - displayName: 'Last Name', - name: 'lastName', - type: 'string', - default: '', - description: 'The last name of the contact to create.', - }, - { - displayName: 'Phone', - name: 'phone', - type: 'string', - default: '', - description: 'Phone number of the contact.', - }, - { - displayName: 'Custom Properties', - name: 'customProperties', - placeholder: 'Add Custom Property', - description: 'Adds a custom property to set also values which have not been predefined.', - type: 'fixedCollection', - typeOptions: { - multipleValues: true, - }, - default: {}, - options: [ - { - name: 'property', - displayName: 'Property', - values: [ - { - displayName: 'Property Name', - name: 'name', - type: 'string', - default: '', - description: 'Name of the property to set.', - }, - { - displayName: 'Property Value', - name: 'value', - type: 'string', - default: '', - description: 'Value of the property to set.', - }, - ] - }, - ], - }, - ], - }, + // ---------------------------------- + // contact:create + // ---------------------------------- + { + displayName: 'Email', + name: 'email', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'contact', + ], + }, + }, + description: 'The email of the contact to create.', + }, + { + displayName: 'Update if exists', + name: 'updateIfExists', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'contact', + ], + }, + }, + default: false, + description: 'Update user if it exists already. If not set and user exists it will error instead.', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'contact', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'First Name', + name: 'firstName', + type: 'string', + default: '', + description: 'The first name of the contact to create.', + }, + { + displayName: 'Last Name', + name: 'lastName', + type: 'string', + default: '', + description: 'The last name of the contact to create.', + }, + { + displayName: 'Phone', + name: 'phone', + type: 'string', + default: '', + description: 'Phone number of the contact.', + }, + { + displayName: 'Custom Properties', + name: 'customProperties', + placeholder: 'Add Custom Property', + description: 'Adds a custom property to set also values which have not been predefined.', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + name: 'property', + displayName: 'Property', + values: [ + { + displayName: 'Property Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the property to set.', + }, + { + displayName: 'Property Value', + name: 'value', + type: 'string', + default: '', + description: 'Value of the property to set.', + }, + ] + }, + ], + }, + ], + }, - // ---------------------------------- - // contact:update - // ---------------------------------- - { - displayName: 'Contact ID', - name: 'contactId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'contact', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the contact to update.', - }, - { - displayName: 'Update Fields', - name: 'updateFields', - type: 'collection', - description: 'The fields to update.', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'contact', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Email', - name: 'email', - type: 'string', - default: '', - description: 'Email of the contact.', - }, - { - displayName: 'First Name', - name: 'firstName', - type: 'string', - default: '', - description: 'First name of the contact.', - }, - { - displayName: 'Last Name', - name: 'lastName', - type: 'string', - default: '', - description: 'Last name of the contact.', - }, - { - displayName: 'Phone', - name: 'phone', - type: 'string', - default: '', - description: 'Phone number of the contact.', - }, - { - displayName: 'Custom Properties', - name: 'customProperties', - placeholder: 'Add Custom Property', - description: 'Adds a custom property to set also values which have not been predefined.', - type: 'fixedCollection', - typeOptions: { - multipleValues: true, - }, - default: {}, - options: [ - { - name: 'property', - displayName: 'Property', - values: [ - { - displayName: 'Property Name', - name: 'name', - type: 'string', - default: '', - description: 'Name of the property to set.', - }, - { - displayName: 'Property Value', - name: 'value', - type: 'string', - default: '', - description: 'Value of the property to set.', - }, - ] - }, - ], - }, - ], - }, + // ---------------------------------- + // contact:update + // ---------------------------------- + { + displayName: 'Contact ID', + name: 'contactId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'contact', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the contact to update.', + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + description: 'The fields to update.', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'contact', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Email', + name: 'email', + type: 'string', + default: '', + description: 'Email of the contact.', + }, + { + displayName: 'First Name', + name: 'firstName', + type: 'string', + default: '', + description: 'First name of the contact.', + }, + { + displayName: 'Last Name', + name: 'lastName', + type: 'string', + default: '', + description: 'Last name of the contact.', + }, + { + displayName: 'Phone', + name: 'phone', + type: 'string', + default: '', + description: 'Phone number of the contact.', + }, + { + displayName: 'Custom Properties', + name: 'customProperties', + placeholder: 'Add Custom Property', + description: 'Adds a custom property to set also values which have not been predefined.', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + name: 'property', + displayName: 'Property', + values: [ + { + displayName: 'Property Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the property to set.', + }, + { + displayName: 'Property Value', + name: 'value', + type: 'string', + default: '', + description: 'Value of the property to set.', + }, + ] + }, + ], + }, + ], + }, - // ---------------------------------- - // contact:delete - // ---------------------------------- - { - displayName: 'Contact ID', - name: 'contactId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'contact', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the contact to delete.', - }, + // ---------------------------------- + // contact:delete + // ---------------------------------- + { + displayName: 'Contact ID', + name: 'contactId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'contact', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the contact to delete.', + }, - // ---------------------------------- - // contact:get - // ---------------------------------- - { - displayName: 'Contact ID', - name: 'contactId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'contact', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the contact to get.', - }, + // ---------------------------------- + // contact:get + // ---------------------------------- + { + displayName: 'Contact ID', + name: 'contactId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'contact', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the contact to get.', + }, - // ---------------------------------- - // contact:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'contact', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'contact', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, + // ---------------------------------- + // contact:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contact', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contact', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, ] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts index e5219177d..940157e5f 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/DealDescription.ts @@ -3,527 +3,527 @@ import { INodeProperties } from "n8n-workflow"; import { allCurrencies } from './currencies'; export const dealOperations = [ - { - displayName: 'Operation', - name: 'operation', - type: 'options', - displayOptions: { - show: { - resource: [ - 'deal', - ], - }, - }, - options: [ - { - name: 'Create', - value: 'create', - description: 'Create a deal', - }, - { - name: 'Delete', - value: 'delete', - description: 'Delete a deal', - }, - { - name: 'Get', - value: 'get', - description: 'Get data of a deal', - }, - { - name: 'Get All', - value: 'getAll', - description: 'Get data of all deals', - }, - { - name: 'Update', - value: 'update', - description: 'Update a deal', - }, - { - name: 'Create Note', - value: 'createNote', - description: 'Create a deal note', - }, - { - name: 'Update deal note', - value: 'updateNote', - description: 'Update a deal note', - }, - ], - default: 'create', - description: 'The operation to perform.', - }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'deal', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a deal', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a deal', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a deal', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all deals', + }, + { + name: 'Update', + value: 'update', + description: 'Update a deal', + }, + { + name: 'Create Note', + value: 'createNote', + description: 'Create a deal note', + }, + { + name: 'Update deal note', + value: 'updateNote', + description: 'Update a deal note', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, ] as INodeProperties[]; export const dealFields = [ - // ---------------------------------- - // deal:create - // ---------------------------------- - { - displayName: 'Title', - name: 'title', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The title of the deal', - }, - { - displayName: 'Deal\'s contact ID', - name: 'contact', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal\'s contact', - }, - { - displayName: 'Deal value', - name: 'value', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The value of the deal in cents', - }, - { - displayName: 'Currency', - name: 'currency', - type: 'options', - default: 'eur', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - options: allCurrencies, - description: 'The currency of the deal in 3-character ISO format', - }, - { - displayName: 'Deal pipeline ID', - name: 'group', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The pipeline ID of the deal', - }, - { - displayName: 'Deal stage ID', - name: 'stage', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The stage ID of the deal', - }, - { - displayName: 'Deal owner ID', - name: 'owner', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The owner ID of the deal', - }, - { - displayName: 'Additional Fields', - name: 'additionalFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'deal', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the deal', - }, + // ---------------------------------- + // deal:create + // ---------------------------------- + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The title of the deal', + }, + { + displayName: 'Deal\'s contact ID', + name: 'contact', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal\'s contact', + }, + { + displayName: 'Deal value', + name: 'value', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The value of the deal in cents', + }, + { + displayName: 'Currency', + name: 'currency', + type: 'options', + default: 'eur', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + options: allCurrencies, + description: 'The currency of the deal in 3-character ISO format', + }, + { + displayName: 'Deal pipeline ID', + name: 'group', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The pipeline ID of the deal', + }, + { + displayName: 'Deal stage ID', + name: 'stage', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The stage ID of the deal', + }, + { + displayName: 'Deal owner ID', + name: 'owner', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The owner ID of the deal', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'deal', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the deal', + }, - { - displayName: 'Deal percentage', - name: 'percent', - type: 'number', - default: 0, - description: 'The percentage of the deal', - }, - { - displayName: 'Deal status', - name: 'status', - type: 'number', - default: 0, - description: 'The status of the deal', - }, - ] - }, + { + displayName: 'Deal percentage', + name: 'percent', + type: 'number', + default: 0, + description: 'The percentage of the deal', + }, + { + displayName: 'Deal status', + name: 'status', + type: 'number', + default: 0, + description: 'The status of the deal', + }, + ] + }, - // ---------------------------------- - // deal:update - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'deal', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the deal to update.', - }, - { - displayName: 'Update Fields', - name: 'updateFields', - type: 'collection', - description: 'The fields to update.', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'deal', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Title', - name: 'title', - type: 'string', - default: '', - description: 'The title of the deal', - }, - { - displayName: 'Deal\'s contact ID', - name: 'contact', - type: 'number', - default: 0, - description: 'The ID of the deal\'s contact', - }, - { - displayName: 'Deal value', - name: 'value', - type: 'number', - default: 0, - description: 'The value of the deal in cents', - }, - { - displayName: 'Currency', - name: 'currency', - type: 'options', - options: allCurrencies, - default: 'eur', - description: 'The currency of the deal in 3-character ISO format', - }, - { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the deal', - }, - { - displayName: 'Deal pipeline ID', - name: 'group', - type: 'string', - default: '', - description: 'The pipeline ID of the deal', - }, - { - displayName: 'Deal stage ID', - name: 'stage', - type: 'string', - default: '', - description: 'The stage ID of the deal', - }, - { - displayName: 'Deal owner ID', - name: 'owner', - type: 'string', - default: '', - description: 'The owner ID of the deal', - }, - { - displayName: 'Deal percentage', - name: 'percent', - type: 'number', - default: 0, - description: 'The percentage of the deal', - }, - { - displayName: 'Deal status', - name: 'status', - type: 'number', - default: 0, - description: 'The status of the deal', - }, - ] - }, + // ---------------------------------- + // deal:update + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the deal to update.', + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + description: 'The fields to update.', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'deal', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + description: 'The title of the deal', + }, + { + displayName: 'Deal\'s contact ID', + name: 'contact', + type: 'number', + default: 0, + description: 'The ID of the deal\'s contact', + }, + { + displayName: 'Deal value', + name: 'value', + type: 'number', + default: 0, + description: 'The value of the deal in cents', + }, + { + displayName: 'Currency', + name: 'currency', + type: 'options', + options: allCurrencies, + default: 'eur', + description: 'The currency of the deal in 3-character ISO format', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the deal', + }, + { + displayName: 'Deal pipeline ID', + name: 'group', + type: 'string', + default: '', + description: 'The pipeline ID of the deal', + }, + { + displayName: 'Deal stage ID', + name: 'stage', + type: 'string', + default: '', + description: 'The stage ID of the deal', + }, + { + displayName: 'Deal owner ID', + name: 'owner', + type: 'string', + default: '', + description: 'The owner ID of the deal', + }, + { + displayName: 'Deal percentage', + name: 'percent', + type: 'number', + default: 0, + description: 'The percentage of the deal', + }, + { + displayName: 'Deal status', + name: 'status', + type: 'number', + default: 0, + description: 'The status of the deal', + }, + ] + }, - // ---------------------------------- - // deal:delete - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal to delete.', - }, + // ---------------------------------- + // deal:delete + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal to delete.', + }, - // ---------------------------------- - // deal:get - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal to get.', - }, + // ---------------------------------- + // deal:get + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal to get.', + }, - // ---------------------------------- - // deal:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'deal', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'deal', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, + // ---------------------------------- + // deal:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'deal', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'deal', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, - // ---------------------------------- - // dealNote:create - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'createNote', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal note', - }, - { - displayName: 'Deal Note', - name: 'dealNote', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'createNote', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The content of the deal note', - }, + // ---------------------------------- + // dealNote:create + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'createNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal note', + }, + { + displayName: 'Deal Note', + name: 'dealNote', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'createNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The content of the deal note', + }, - // ---------------------------------- - // dealNote:update - // ---------------------------------- - { - displayName: 'Deal ID', - name: 'dealId', - type: 'number', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'updateNote', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal note', - }, - { - displayName: 'Deal note ID', - name: 'dealNoteId', - type: 'number', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'updateNote', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The ID of the deal note', - }, - { - displayName: 'Deal Note', - name: 'dealNote', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'updateNote', - ], - resource: [ - 'deal', - ], - }, - }, - description: 'The content of the deal note', - }, + // ---------------------------------- + // dealNote:update + // ---------------------------------- + { + displayName: 'Deal ID', + name: 'dealId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'updateNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal note', + }, + { + displayName: 'Deal note ID', + name: 'dealNoteId', + type: 'number', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'updateNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The ID of the deal note', + }, + { + displayName: 'Deal Note', + name: 'dealNote', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'updateNote', + ], + resource: [ + 'deal', + ], + }, + }, + description: 'The content of the deal note', + }, ] as INodeProperties[]; \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts index f7f75e3fb..2b8b0d33c 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomCustomerDescription.ts @@ -1,290 +1,290 @@ import { INodeProperties } from "n8n-workflow"; export const ecomCustomerOperations = [ - { - displayName: 'Operation', - name: 'operation', - type: 'options', - displayOptions: { - show: { - resource: [ - 'ecommerceCustomer', - ], - }, - }, - options: [ - { - name: 'Create', - value: 'create', - description: 'Create a E-commerce Customer', - }, - { - name: 'Delete', - value: 'delete', - description: 'Delete a E-commerce Customer', - }, - { - name: 'Get', - value: 'get', - description: 'Get data of a E-commerce Customer', - }, - { - name: 'Get All', - value: 'getAll', - description: 'Get data of all E-commerce Customer', - }, - { - name: 'Update', - value: 'update', - description: 'Update a E-commerce Customer', - }, - ], - default: 'create', - description: 'The operation to perform.', - }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'ecommerceCustomer', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a E-commerce Customer', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a E-commerce Customer', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a E-commerce Customer', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all E-commerce Customer', + }, + { + name: 'Update', + value: 'update', + description: 'Update a E-commerce Customer', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, ] as INodeProperties[]; export const ecomCustomerFields = [ - // ---------------------------------- - // ecommerceCustomer:create - // ---------------------------------- - { - displayName: 'Service ID', - name: 'connectionid', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceCustomer', - ], - }, - }, - description: 'The id of the connection object for the service where the customer originates.', - }, - { - displayName: 'Customer ID', - name: 'externalid', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceCustomer', - ], - }, - }, - description: 'The id of the customer in the external service.', - }, - { - displayName: 'Customer Email', - name: 'email', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceCustomer', - ], - }, - }, - description: 'The email address of the customer.', - }, - { - displayName: 'Additional Fields', - name: 'additionalFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceCustomer', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Accepts Marketing', - name: 'acceptsMarketing', - type: 'boolean', - default: false, - description: 'Indication of whether customer has opt-ed in to marketing communications.', - }, - ], - }, + // ---------------------------------- + // ecommerceCustomer:create + // ---------------------------------- + { + displayName: 'Service ID', + name: 'connectionid', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + description: 'The id of the connection object for the service where the customer originates.', + }, + { + displayName: 'Customer ID', + name: 'externalid', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + description: 'The id of the customer in the external service.', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + description: 'The email address of the customer.', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Accepts Marketing', + name: 'acceptsMarketing', + type: 'boolean', + default: false, + description: 'Indication of whether customer has opt-ed in to marketing communications.', + }, + ], + }, - // ---------------------------------- - // ecommerceCustomer:update - // ---------------------------------- - { - displayName: 'Customer ID', - name: 'ecommerceCustomerId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'ecommerceCustomer', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the E-commerce customer to update.', - }, - { - displayName: 'Update Fields', - name: 'updateFields', - type: 'collection', - description: 'The fields to update.', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'ecommerceCustomer', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Service ID', - name: 'connectionid', - type: 'string', - default: '', - description: 'The id of the connection object for the service where the customer originates.', - }, - { - displayName: 'Customer ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the customer in the external service.', - }, - { - displayName: 'Customer Email', - name: 'email', - type: 'string', - default: '', - description: 'The email address of the customer.', - }, - { - displayName: 'Accepts Marketing', - name: 'acceptsMarketing', - type: 'boolean', - default: false, - description: 'Indication of whether customer has opt-ed in to marketing communications.', - }, - ], - }, + // ---------------------------------- + // ecommerceCustomer:update + // ---------------------------------- + { + displayName: 'Customer ID', + name: 'ecommerceCustomerId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the E-commerce customer to update.', + }, + { + displayName: 'Update Fields', + name: 'updateFields', + type: 'collection', + description: 'The fields to update.', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Service ID', + name: 'connectionid', + type: 'string', + default: '', + description: 'The id of the connection object for the service where the customer originates.', + }, + { + displayName: 'Customer ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the customer in the external service.', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + description: 'The email address of the customer.', + }, + { + displayName: 'Accepts Marketing', + name: 'acceptsMarketing', + type: 'boolean', + default: false, + description: 'Indication of whether customer has opt-ed in to marketing communications.', + }, + ], + }, - // ---------------------------------- - // ecommerceCustomer:delete - // ---------------------------------- - { - displayName: 'Customer ID', - name: 'ecommerceCustomerId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'ecommerceCustomer', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the E-commerce customer to delete.', - }, + // ---------------------------------- + // ecommerceCustomer:delete + // ---------------------------------- + { + displayName: 'Customer ID', + name: 'ecommerceCustomerId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the E-commerce customer to delete.', + }, - // ---------------------------------- - // ecommerceCustomer:get - // ---------------------------------- - { - displayName: 'Customer ID', - name: 'ecommerceCustomerId', - type: 'number', - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'ecommerceCustomer', - ], - }, - }, - default: 0, - required: true, - description: 'ID of the E-commerce customer to get.', - }, + // ---------------------------------- + // ecommerceCustomer:get + // ---------------------------------- + { + displayName: 'Customer ID', + name: 'ecommerceCustomerId', + type: 'number', + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: 0, + required: true, + description: 'ID of the E-commerce customer to get.', + }, - // ---------------------------------- - // ecommerceCustomer:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'ecommerceCustomer', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'ecommerceCustomer', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, + // ---------------------------------- + // ecommerceCustomer:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceCustomer', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceCustomer', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, ] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts index a1c0993df..525fa0eb2 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderDescription.ts @@ -3,714 +3,714 @@ import { INodeProperties } from "n8n-workflow"; import { allCurrencies } from './currencies'; export const ecomOrderOperations = [ - { - displayName: 'Operation', - name: 'operation', - type: 'options', - displayOptions: { - show: { - resource: [ - 'ecommerceOrder', - ], - }, - }, - options: [ - { - name: 'Create', - value: 'create', - description: 'Create a order', - }, - { - name: 'Delete', - value: 'delete', - description: 'Delete a order', - }, - { - name: 'Get', - value: 'get', - description: 'Get data of a order', - }, - { - name: 'Get All', - value: 'getAll', - description: 'Get data of all orders', - }, - { - name: 'Update', - value: 'update', - description: 'Update a order', - }, - ], - default: 'create', - description: 'The operation to perform.', - }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'ecommerceOrder', + ], + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a order', + }, + { + name: 'Delete', + value: 'delete', + description: 'Delete a order', + }, + { + name: 'Get', + value: 'get', + description: 'Get data of a order', + }, + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all orders', + }, + { + name: 'Update', + value: 'update', + description: 'Update a order', + }, + ], + default: 'create', + description: 'The operation to perform.', + }, ] as INodeProperties[]; export const ecomOrderFields = [ - // ---------------------------------- - // ecommerceOrder:create - // ---------------------------------- - { - displayName: 'External ID', - name: 'externalid', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', - }, - { - displayName: 'External checkout ID', - name: 'externalcheckoutid', - type: 'string', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', - }, - { - displayName: 'Order source', - name: 'source', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', - }, - { - displayName: 'Customer Email', - name: 'email', - type: 'string', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The email address of the customer who placed the order.', - }, - { - displayName: 'Total price', - name: 'totalPrice', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Order currency', - name: 'currency', - type: 'options', - default: 'eur', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - options: allCurrencies, - description: 'The currency of the order (3-digit ISO code, e.g., "USD").', - }, - { - displayName: 'Connection ID', - name: 'connectionid', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the connection from which this order originated.', - }, - { - displayName: 'Customer ID', - name: 'customerid', - type: 'number', - default: 0, - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the customer associated with this order.', - }, - { - displayName: 'Creation Date', - name: 'externalCreatedDate', - type: 'dateTime', - default: '', - required: true, - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The date the order was placed.', - }, - { - displayName: 'Abandoning Date', - name: 'abandonedDate', - type: 'dateTime', - default: '', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', - }, - { - displayName: 'Products', - name: 'orderProducts', - type: 'collection', - typeOptions: { - multipleValues: true, - multipleValueButtonText: 'Add product', - }, - displayOptions: { - show: { - operation: [ - 'create' - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: {}, - description: 'All ordered products', - placeholder: 'Add product field', - options: [ - { - displayName: 'Name', - name: 'name', - type: 'string', - default: '', - description: 'The name of the product', - }, - { - displayName: 'Price', - name: 'price', - type: 'number', - default: 0, - description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Product Quantity', - name: 'quantity', - type: 'number', - default: 0, - description: 'The quantity ordered.', - }, - { - displayName: 'Product external ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the product in the external service.', - }, - { - displayName: 'Product Category', - name: 'category', - type: 'string', - default: '', - description: 'The category of the product.', - }, - { - displayName: 'SKU', - name: 'sku', - type: 'string', - default: '', - description: 'The SKU for the product.', - }, - { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the product.', - }, - { - displayName: 'Image URL', - name: 'imageUrl', - type: 'string', - default: '', - description: 'An Image URL that displays an image of the product.', - }, - { - displayName: 'Product URL', - name: 'productUrl', - type: 'string', - default: '', - description: 'A URL linking to the product in your store.', - }, - ], - }, - { - displayName: 'Additional Fields', - name: 'additionalFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'Shipping Amount', - name: 'shippingAmount', - type: 'number', - default: 0, - description: 'The total shipping amount for the order in cents .', - }, + // ---------------------------------- + // ecommerceOrder:create + // ---------------------------------- + { + displayName: 'External ID', + name: 'externalid', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', + }, + { + displayName: 'External checkout ID', + name: 'externalcheckoutid', + type: 'string', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', + }, + { + displayName: 'Order source', + name: 'source', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The email address of the customer who placed the order.', + }, + { + displayName: 'Total price', + name: 'totalPrice', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Order currency', + name: 'currency', + type: 'options', + default: 'eur', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + options: allCurrencies, + description: 'The currency of the order (3-digit ISO code, e.g., "USD").', + }, + { + displayName: 'Connection ID', + name: 'connectionid', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the connection from which this order originated.', + }, + { + displayName: 'Customer ID', + name: 'customerid', + type: 'number', + default: 0, + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the customer associated with this order.', + }, + { + displayName: 'Creation Date', + name: 'externalCreatedDate', + type: 'dateTime', + default: '', + required: true, + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The date the order was placed.', + }, + { + displayName: 'Abandoning Date', + name: 'abandonedDate', + type: 'dateTime', + default: '', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', + }, + { + displayName: 'Products', + name: 'orderProducts', + type: 'collection', + typeOptions: { + multipleValues: true, + multipleValueButtonText: 'Add product', + }, + displayOptions: { + show: { + operation: [ + 'create' + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + description: 'All ordered products', + placeholder: 'Add product field', + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'The name of the product', + }, + { + displayName: 'Price', + name: 'price', + type: 'number', + default: 0, + description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Product Quantity', + name: 'quantity', + type: 'number', + default: 0, + description: 'The quantity ordered.', + }, + { + displayName: 'Product external ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the product in the external service.', + }, + { + displayName: 'Product Category', + name: 'category', + type: 'string', + default: '', + description: 'The category of the product.', + }, + { + displayName: 'SKU', + name: 'sku', + type: 'string', + default: '', + description: 'The SKU for the product.', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the product.', + }, + { + displayName: 'Image URL', + name: 'imageUrl', + type: 'string', + default: '', + description: 'An Image URL that displays an image of the product.', + }, + { + displayName: 'Product URL', + name: 'productUrl', + type: 'string', + default: '', + description: 'A URL linking to the product in your store.', + }, + ], + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'Shipping Amount', + name: 'shippingAmount', + type: 'number', + default: 0, + description: 'The total shipping amount for the order in cents .', + }, - { - displayName: 'Tax Amount', - name: 'taxAmount', - type: 'number', - default: 0, - description: 'The total tax amount for the order in cents.', - }, - { - displayName: 'Discount Amount', - name: 'discountAmount', - type: 'number', - default: 0, - description: 'The total discount amount for the order in cents.', - }, - { - displayName: 'Order URL', - name: 'orderUrl', - type: 'string', - default: '', - description: 'The URL for the order in the external service.', - }, - { - displayName: 'External updated date', - name: 'externalUpdatedDate', - type: 'dateTime', - default: '', - description: 'The date the order was updated.', - }, - { - displayName: 'Shipping Method', - name: 'shippingMethod', - type: 'string', - default: '', - description: 'The shipping method of the order.', - }, - { - displayName: 'Order Number', - name: 'orderNumber', - type: 'string', - default: '', - description: 'The order number. This can be different than the externalid.', - }, + { + displayName: 'Tax Amount', + name: 'taxAmount', + type: 'number', + default: 0, + description: 'The total tax amount for the order in cents.', + }, + { + displayName: 'Discount Amount', + name: 'discountAmount', + type: 'number', + default: 0, + description: 'The total discount amount for the order in cents.', + }, + { + displayName: 'Order URL', + name: 'orderUrl', + type: 'string', + default: '', + description: 'The URL for the order in the external service.', + }, + { + displayName: 'External updated date', + name: 'externalUpdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was updated.', + }, + { + displayName: 'Shipping Method', + name: 'shippingMethod', + type: 'string', + default: '', + description: 'The shipping method of the order.', + }, + { + displayName: 'Order Number', + name: 'orderNumber', + type: 'string', + default: '', + description: 'The order number. This can be different than the externalid.', + }, - ] - }, + ] + }, - // ---------------------------------- - // ecommerceOrder:update - // ---------------------------------- - { - displayName: 'Order ID', - name: 'orderId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the e-commerce order.', - }, + // ---------------------------------- + // ecommerceOrder:update + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, - { - displayName: 'Add Field', - name: 'updateFields', - type: 'collection', - placeholder: 'Add Field', - displayOptions: { - show: { - operation: [ - 'update', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: {}, - options: [ - { - displayName: 'External ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', - }, - { - displayName: 'External checkout ID', - name: 'externalcheckoutid', - type: 'string', - default: '', - description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', - }, - { - displayName: 'Order source', - name: 'source', - type: 'number', - default: 0, - description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', - }, - { - displayName: 'Customer Email', - name: 'email', - type: 'string', - default: '', - description: 'The email address of the customer who placed the order.', - }, - { - displayName: 'Total price', - name: 'totalPrice', - type: 'number', - default: 0, - description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Order currency', - name: 'currency', - type: 'options', - default: 'eur', - options: allCurrencies, - description: 'The currency of the order (3-digit ISO code, e.g., "USD").', - }, - { - displayName: 'Connection ID', - name: 'connectionid', - type: 'number', - default: 0, - description: 'The id of the connection from which this order originated.', - }, - { - displayName: 'Customer ID', - name: 'customerid', - type: 'number', - default: 0, - description: 'The id of the customer associated with this order.', - }, - { - displayName: 'Creation Date', - name: 'externalupdatedDate', - type: 'dateTime', - default: '', - description: 'The date the order was placed.', - }, - { - displayName: 'Abandoning Date', - name: 'abandonedDate', - type: 'dateTime', - default: '', - description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', - }, - { - displayName: 'Shipping Amount', - name: 'shippingAmount', - type: 'number', - default: 0, - description: 'The total shipping amount for the order in cents .', - }, + { + displayName: 'Add Field', + name: 'updateFields', + type: 'collection', + placeholder: 'Add Field', + displayOptions: { + show: { + operation: [ + 'update', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: {}, + options: [ + { + displayName: 'External ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the order in the external service. ONLY REQUIRED IF EXTERNALCHECKOUTID NOT INCLUDED', + }, + { + displayName: 'External checkout ID', + name: 'externalcheckoutid', + type: 'string', + default: '', + description: 'The id of the cart in the external service. ONLY REQUIRED IF EXTERNALID IS NOT INCLUDED.', + }, + { + displayName: 'Order source', + name: 'source', + type: 'number', + default: 0, + description: 'The order source code (0 - will not trigger automations, 1 - will trigger automations).', + }, + { + displayName: 'Customer Email', + name: 'email', + type: 'string', + default: '', + description: 'The email address of the customer who placed the order.', + }, + { + displayName: 'Total price', + name: 'totalPrice', + type: 'number', + default: 0, + description: 'The total price of the order in cents, including tax and shipping charges. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Order currency', + name: 'currency', + type: 'options', + default: 'eur', + options: allCurrencies, + description: 'The currency of the order (3-digit ISO code, e.g., "USD").', + }, + { + displayName: 'Connection ID', + name: 'connectionid', + type: 'number', + default: 0, + description: 'The id of the connection from which this order originated.', + }, + { + displayName: 'Customer ID', + name: 'customerid', + type: 'number', + default: 0, + description: 'The id of the customer associated with this order.', + }, + { + displayName: 'Creation Date', + name: 'externalupdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was placed.', + }, + { + displayName: 'Abandoning Date', + name: 'abandonedDate', + type: 'dateTime', + default: '', + description: 'The date the cart was abandoned. REQUIRED ONLY IF INCLUDING EXTERNALCHECKOUTID.', + }, + { + displayName: 'Shipping Amount', + name: 'shippingAmount', + type: 'number', + default: 0, + description: 'The total shipping amount for the order in cents .', + }, - { - displayName: 'Tax Amount', - name: 'taxAmount', - type: 'number', - default: 0, - description: 'The total tax amount for the order in cents.', - }, - { - displayName: 'Discount Amount', - name: 'discountAmount', - type: 'number', - default: 0, - description: 'The total discount amount for the order in cents.', - }, - { - displayName: 'Order URL', - name: 'orderUrl', - type: 'string', - default: '', - description: 'The URL for the order in the external service.', - }, - { - displayName: 'External updated date', - name: 'externalUpdatedDate', - type: 'dateTime', - default: '', - description: 'The date the order was updated.', - }, - { - displayName: 'Shipping Method', - name: 'shippingMethod', - type: 'string', - default: '', - description: 'The shipping method of the order.', - }, - { - displayName: 'Order Number', - name: 'orderNumber', - type: 'string', - default: '', - description: 'The order number. This can be different than the externalid.', - }, + { + displayName: 'Tax Amount', + name: 'taxAmount', + type: 'number', + default: 0, + description: 'The total tax amount for the order in cents.', + }, + { + displayName: 'Discount Amount', + name: 'discountAmount', + type: 'number', + default: 0, + description: 'The total discount amount for the order in cents.', + }, + { + displayName: 'Order URL', + name: 'orderUrl', + type: 'string', + default: '', + description: 'The URL for the order in the external service.', + }, + { + displayName: 'External updated date', + name: 'externalUpdatedDate', + type: 'dateTime', + default: '', + description: 'The date the order was updated.', + }, + { + displayName: 'Shipping Method', + name: 'shippingMethod', + type: 'string', + default: '', + description: 'The shipping method of the order.', + }, + { + displayName: 'Order Number', + name: 'orderNumber', + type: 'string', + default: '', + description: 'The order number. This can be different than the externalid.', + }, - { - displayName: 'Products', - name: 'orderProducts', - type: 'collection', - typeOptions: { - multipleValues: true, - multipleValueButtonText: 'Add product', - }, - default: {}, - description: 'All ordered products', - placeholder: 'Add product field', - options: [ - { - displayName: 'Name', - name: 'name', - type: 'string', - default: '', - description: 'The name of the product', - }, - { - displayName: 'Price', - name: 'price', - type: 'number', - default: 0, - description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', - }, - { - displayName: 'Product Quantity', - name: 'quantity', - type: 'number', - default: 0, - description: 'The quantity ordered.', - }, - { - displayName: 'Product external ID', - name: 'externalid', - type: 'string', - default: '', - description: 'The id of the product in the external service.', - }, - { - displayName: 'Product Category', - name: 'category', - type: 'string', - default: '', - description: 'The category of the product.', - }, - { - displayName: 'SKU', - name: 'sku', - type: 'string', - default: '', - description: 'The SKU for the product.', - }, - { - displayName: 'Description', - name: 'description', - type: 'string', - default: '', - description: 'The description of the product.', - }, - { - displayName: 'Image URL', - name: 'imageUrl', - type: 'string', - default: '', - description: 'An Image URL that displays an image of the product.', - }, - { - displayName: 'Product URL', - name: 'productUrl', - type: 'string', - default: '', - description: 'A URL linking to the product in your store.', - }, - ], - }, + { + displayName: 'Products', + name: 'orderProducts', + type: 'collection', + typeOptions: { + multipleValues: true, + multipleValueButtonText: 'Add product', + }, + default: {}, + description: 'All ordered products', + placeholder: 'Add product field', + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'The name of the product', + }, + { + displayName: 'Price', + name: 'price', + type: 'number', + default: 0, + description: 'The price of the product, in cents. (i.e. $456.78 => 45678). Must be greater than or equal to zero.', + }, + { + displayName: 'Product Quantity', + name: 'quantity', + type: 'number', + default: 0, + description: 'The quantity ordered.', + }, + { + displayName: 'Product external ID', + name: 'externalid', + type: 'string', + default: '', + description: 'The id of the product in the external service.', + }, + { + displayName: 'Product Category', + name: 'category', + type: 'string', + default: '', + description: 'The category of the product.', + }, + { + displayName: 'SKU', + name: 'sku', + type: 'string', + default: '', + description: 'The SKU for the product.', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'The description of the product.', + }, + { + displayName: 'Image URL', + name: 'imageUrl', + type: 'string', + default: '', + description: 'An Image URL that displays an image of the product.', + }, + { + displayName: 'Product URL', + name: 'productUrl', + type: 'string', + default: '', + description: 'A URL linking to the product in your store.', + }, + ], + }, - ] - }, + ] + }, - // ---------------------------------- - // ecommerceOrder:delete - // ---------------------------------- - { - displayName: 'Order ID', - name: 'orderId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'delete', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the e-commerce order.', - }, + // ---------------------------------- + // ecommerceOrder:delete + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'delete', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, - // ---------------------------------- - // ecommerceOrder:get - // ---------------------------------- - { - displayName: 'Order ID', - name: 'orderId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'get', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - description: 'The id of the e-commerce order.', - }, + // ---------------------------------- + // ecommerceOrder:get + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'get', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + description: 'The id of the e-commerce order.', + }, - // ---------------------------------- - // ecommerceOrder:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'ecommerceOrder', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'ecommerceOrder', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, + // ---------------------------------- + // ecommerceOrder:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrder', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrder', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, ] as INodeProperties[]; \ No newline at end of file diff --git a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts index 29869a743..1f53c47f0 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/EcomOrderProductsDescription.ts @@ -1,124 +1,124 @@ import { INodeProperties } from "n8n-workflow"; export const ecomOrderProductsOperations = [ - { - displayName: 'Operation', - name: 'operation', - type: 'options', - displayOptions: { - show: { - resource: [ - 'ecommerceOrderProducts', - ], - }, - }, - options: [ - { - name: 'Get All', - value: 'getAll', - description: 'Get data of all order products', - }, - { - name: 'Get by Product ID', - value: 'getByProductId', - description: 'Get data of a ordered product', - }, - { - name: 'Get by Order ID', - value: 'getByOrderId', - description: 'Get data of an order\'s products', - }, - ], - default: 'getAll', - description: 'The operation to perform.', - }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + displayOptions: { + show: { + resource: [ + 'ecommerceOrderProducts', + ], + }, + }, + options: [ + { + name: 'Get All', + value: 'getAll', + description: 'Get data of all order products', + }, + { + name: 'Get by Product ID', + value: 'getByProductId', + description: 'Get data of a ordered product', + }, + { + name: 'Get by Order ID', + value: 'getByOrderId', + description: 'Get data of an order\'s products', + }, + ], + default: 'getAll', + description: 'The operation to perform.', + }, ] as INodeProperties[]; export const ecomOrderProductsFields = [ - // ---------------------------------- - // ecommerceOrderProducts:getByOrderId - // ---------------------------------- - { - displayName: 'Order ID', - name: 'orderId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'getByOrderId', - ], - resource: [ - 'ecommerceOrderProducts', - ], - }, - }, - description: 'The ID of the order whose products you\'d like returned.', - }, + // ---------------------------------- + // ecommerceOrderProducts:getByOrderId + // ---------------------------------- + { + displayName: 'Order ID', + name: 'orderId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'getByOrderId', + ], + resource: [ + 'ecommerceOrderProducts', + ], + }, + }, + description: 'The ID of the order whose products you\'d like returned.', + }, - // ---------------------------------- - // ecommerceOrderProducts:getByProductId - // ---------------------------------- - { - displayName: 'Product ID', - name: 'procuctId', - type: 'number', - default: 0, - displayOptions: { - show: { - operation: [ - 'getByProductId', - ], - resource: [ - 'ecommerceOrderProducts', - ], - }, - }, - description: 'The ID of the product you\'d like returned.', - }, + // ---------------------------------- + // ecommerceOrderProducts:getByProductId + // ---------------------------------- + { + displayName: 'Product ID', + name: 'procuctId', + type: 'number', + default: 0, + displayOptions: { + show: { + operation: [ + 'getByProductId', + ], + resource: [ + 'ecommerceOrderProducts', + ], + }, + }, + description: 'The ID of the product you\'d like returned.', + }, - // ---------------------------------- - // ecommerceOrderProducts:getAll - // ---------------------------------- - { - displayName: 'Return All', - name: 'returnAll', - type: 'boolean', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'ecommerceOrderProducts', - ], - }, - }, - default: false, - description: 'If all results should be returned or only up to a given limit.', - }, - { - displayName: 'Limit', - name: 'limit', - type: 'number', - displayOptions: { - show: { - operation: [ - 'getAll', - ], - resource: [ - 'ecommerceOrderProducts', - ], - returnAll: [ - false, - ], - }, - }, - typeOptions: { - minValue: 1, - maxValue: 500, - }, - default: 100, - description: 'How many results to return.', - }, + // ---------------------------------- + // ecommerceOrderProducts:getAll + // ---------------------------------- + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrderProducts', + ], + }, + }, + default: false, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'ecommerceOrderProducts', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 500, + }, + default: 100, + description: 'How many results to return.', + }, ] as INodeProperties[]; \ No newline at end of file From 821556e85adb737005db089f94d481d44f9d55d7 Mon Sep 17 00:00:00 2001 From: Romain Dunand Date: Thu, 7 Nov 2019 18:38:38 +0100 Subject: [PATCH 46/66] Shift column index by startRange instead of keyColumnIndex --- packages/nodes-base/nodes/Google/GoogleSheet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Google/GoogleSheet.ts b/packages/nodes-base/nodes/Google/GoogleSheet.ts index 72391939a..d2eb887b9 100644 --- a/packages/nodes-base/nodes/Google/GoogleSheet.ts +++ b/packages/nodes-base/nodes/Google/GoogleSheet.ts @@ -312,7 +312,7 @@ export class GoogleSheet { // Property exists so add it to the data to update // Get the column name in which the property data can be found - updateColumnName = String.fromCharCode(characterCode + keyColumnOrder.indexOf(propertyName)); + updateColumnName = String.fromCharCode(rangeStart.toUpperCase().charCodeAt(0) + keyColumnOrder.indexOf(propertyName)); updateData.push({ range: `${sheet ? sheet + '!' : ''}${updateColumnName}${updateRowIndex}`, From 2292cc018c1fe4090de437047ba3cd454a8ec0af Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Thu, 7 Nov 2019 13:07:29 -0500 Subject: [PATCH 47/66] UI finished --- .../credentials/FreshdeskApi.credentials.ts | 20 +- .../nodes/Freshdesk/Freshdesk.node.ts | 226 ++++++++++++++++-- .../nodes/Freshdesk/GenericFunctions.ts | 6 +- 3 files changed, 219 insertions(+), 33 deletions(-) diff --git a/packages/nodes-base/credentials/FreshdeskApi.credentials.ts b/packages/nodes-base/credentials/FreshdeskApi.credentials.ts index 26e0e4f31..3179abff1 100644 --- a/packages/nodes-base/credentials/FreshdeskApi.credentials.ts +++ b/packages/nodes-base/credentials/FreshdeskApi.credentials.ts @@ -9,23 +9,17 @@ export class FreshdeskApi implements ICredentialType { displayName = 'Freshdesk API'; properties = [ { - displayName: 'Username', - name: 'username', + displayName: 'API Key', + name: 'apiKey', type: 'string' as NodePropertyTypes, default: '', - }, - { - displayName: 'Password', - name: 'password', - type: 'password' as NodePropertyTypes, - default: '', - }, - { + }, + { displayName: 'Domain', name: 'domain', type: 'string' as NodePropertyTypes, - default: '', - placeholder: 'https://domain.freshdesk.com' - }, + placeholder: 'https://domain.freshdesk.com', + default: '' + } ]; } diff --git a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts index 68e155908..7dbeb88a6 100644 --- a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts +++ b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts @@ -13,9 +13,6 @@ import { freshdeskApiRequest } from './GenericFunctions'; -import moment = require('moment'); -import _ = require('lodash') - enum Status { Open = 1, Pending = 2, @@ -30,6 +27,16 @@ enum Priority { Urgent = 4 } +enum Source { + Email = 1, + Portal = 2, + Phone = 3, + Chat = 4, + Mobihelp = 5, + FeedbackWidget = 6, + OutboundEmail =7 +} + interface ICreateTicketBody { name?: string; requester_id?: number; @@ -37,13 +44,13 @@ interface ICreateTicketBody { facebook_id?: string; phone?: string; twitter_id?: string; - unique_external_id?: string, - subject?: string, - type?: string, - status: Status, - priority: Priority, - description?: string, - responder_id?: number, + unique_external_id?: string; + subject?: string; + type?: string; + status: Status; + priority: Priority; + description?: string; + responder_id?: number; cc_emails?: [string]; custom_fields?: IDataObject; due_by?: string; @@ -51,7 +58,7 @@ interface ICreateTicketBody { fr_due_by?: string; group_id?: number; product_id?: number; - source: number; + source: Source; tags: [string]; company_id: number; } @@ -255,6 +262,54 @@ export class Freshdesk implements INodeType { default: 'low', description: 'Priority', }, + { + displayName: 'Source', + name: 'source', + type: 'options', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ], + operation: [ + 'create' + ] + }, + }, + options: [ + { + name: 'Email', + value: 'email', + }, + { + name: 'Portal', + value: 'portal', + }, + { + name: 'Phone', + value: 'phone', + }, + { + name: 'Chat', + value: 'chat', + }, + { + name: 'Mobihelp', + value: 'mobileHelp', + }, + { + name: 'Feedback Widget', + value: 'feedbackWidget', + }, + { + name: 'Outbound Email', + value: 'OutboundEmail', + } + ], + default: 'portal', + description: 'The channel through which the ticket was created.', + }, { displayName: 'JSON Parameters', name: 'jsonParameters', @@ -316,6 +371,7 @@ export class Freshdesk implements INodeType { displayName: 'Description', name: 'description', type: 'string', + required: false, default: '', typeOptions: { rows: 5, @@ -327,6 +383,7 @@ export class Freshdesk implements INodeType { displayName: 'Agent', name: 'agent', type: 'options', + required: false, default: '', typeOptions: { loadOptionsMethod: 'getAgents' @@ -336,10 +393,78 @@ export class Freshdesk implements INodeType { { displayName: 'CC Emails', name: 'ccEmails', + required: false, type: 'string', default: '', description: `separated by , email addresses added in the 'cc' field of the incoming ticket email`, }, + { + displayName: 'Tags', + name: 'tags', + required: false, + type: 'string', + default: '', + description: `separated by , tags that have been associated with the ticket`, + }, + { + displayName: 'Due By', + name: 'dueBy', + required: false, + type: 'dateTime', + default: '', + description: `Timestamp that denotes when the ticket is due to be resolved`, + }, + { + displayName: 'Email config Id', + name: 'emailConfigId', + type: 'number', + required: false, + default: '', + description: `ID of email config which is used for this ticket. (i.e., support@yourcompany.com/sales@yourcompany.com) + If product_id is given and email_config_id is not given, product's primary email_config_id will be set`, + }, + { + displayName: 'FR Due By', + name: 'frDueBy', + type: 'number', + required: false, + default: '', + description: `Timestamp that denotes when the first response is due`, + }, + { + displayName: 'Group', + name: 'group', + required: false, + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getGroups' + }, + description: `ID of the group to which the ticket has been assigned. The default value is the ID of the group that is associated with the given email_config_id`, + }, + { + displayName: 'Product', + name: 'product', + required: false, + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getProducts' + }, + description: `ID of the product to which the ticket is associated. + It will be ignored if the email_config_id attribute is set in the request.`, + }, + { + displayName: 'Company', + name: 'company', + required: false, + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getCompanies' + }, + description: `Company ID of the requester. This attribute can only be set if the Multiple Companies feature is enabled (Estate plan and above)`, + }, ] }, { @@ -347,6 +472,7 @@ export class Freshdesk implements INodeType { name: 'customFieldsUi', placeholder: 'Add Custom fields', type: 'fixedCollection', + required: false, default: '', typeOptions: { multipleValues: true, @@ -372,6 +498,7 @@ export class Freshdesk implements INodeType { values: [ { displayName: 'Key', + required: false, name: 'key', type: 'string', default: '', @@ -380,6 +507,7 @@ export class Freshdesk implements INodeType { displayName: 'Value', name: 'value', type: 'string', + required: false, default: '', }, ], @@ -407,6 +535,7 @@ export class Freshdesk implements INodeType { }, }, default: '', + required: false, placeholder: `{ "gadget":"Cold Welder" }`, @@ -425,7 +554,7 @@ export class Freshdesk implements INodeType { try { agents = await freshdeskApiRequest.call(this, '/agents', 'GET'); } catch (err) { - throw new Error(`Mandrill Error: ${err}`); + throw new Error(`Freshdesk Error: ${err}`); } for (const agent of agents) { const agentName = agent.contact.name; @@ -436,19 +565,82 @@ export class Freshdesk implements INodeType { value: agentId, }); } - return returnData; - } + }, + + // Get all the groups to display them to user so that he can + // select them easily + async getGroups(this: ILoadOptionsFunctions): Promise { + const returnData: INodePropertyOptions[] = []; + let groups; + try { + groups = await freshdeskApiRequest.call(this, '/groups', 'GET'); + } catch (err) { + throw new Error(`Freshdesk Error: ${err}`); + } + for (const group of groups) { + const groupName = group.name; + const groupId = group.id; + + returnData.push({ + name: groupName, + value: groupId, + }); + } + return returnData; + }, + + // Get all the products to display them to user so that he can + // select them easily + async getProducts(this: ILoadOptionsFunctions): Promise { + const returnData: INodePropertyOptions[] = []; + let products; + try { + products = await freshdeskApiRequest.call(this, '/products', 'GET'); + } catch (err) { + throw new Error(`Freshdesk Error: ${err}`); + } + for (const product of products) { + const productName = product.name; + const productId = product.id; + + returnData.push({ + name: productName, + value: productId, + }); + } + return returnData; + }, + + // Get all the companies to display them to user so that he can + // select them easily + async getCompanies(this: ILoadOptionsFunctions): Promise { + const returnData: INodePropertyOptions[] = []; + let companies; + try { + companies = await freshdeskApiRequest.call(this, '/companies', 'GET'); + } catch (err) { + throw new Error(`Freshdesk Error: ${err}`); + } + for (const company of companies) { + const companyName = company.name; + const companyId = company.id; + + returnData.push({ + name: companyName, + value: companyId, + }); + } + return returnData; + }, }, }; - - async executeSingle(this: IExecuteSingleFunctions): Promise { return { json: {} - } + }; } } diff --git a/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts index 3a80586c7..acab34f81 100644 --- a/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts @@ -19,9 +19,9 @@ export async function freshdeskApiRequest(this: IHookFunctions | IExecuteFunctio throw new Error('No credentials got returned!'); } - const userpass = `${credentials.username}:${credentials.password}` + const apiKey = `${credentials.apiKey}:X`; - const headerWithAuthentication = Object.assign({}, headers, { Authorization: `Basic ${Buffer.from(userpass).toString(BINARY_ENCODING)}` }); + const headerWithAuthentication = Object.assign({}, headers, { Authorization: `${Buffer.from(apiKey).toString(BINARY_ENCODING)}` }); const endpoint = 'freshdesk.com/api/v2/'; @@ -34,7 +34,7 @@ export async function freshdeskApiRequest(this: IHookFunctions | IExecuteFunctio }; if (_.isEmpty(options.body)) { - delete options.body + delete options.body; } try { From fcb4f8554c522ea37befca39f807666eb8150b36 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 7 Nov 2019 21:05:34 +0100 Subject: [PATCH 48/66] :books: Add links to example docker-compose setup --- docker/images/n8n/README.md | 7 +++++++ docs/docker.md | 3 +++ 2 files changed, 10 insertions(+) diff --git a/docker/images/n8n/README.md b/docker/images/n8n/README.md index 3250fd4e1..8ab93f0e0 100644 --- a/docker/images/n8n/README.md +++ b/docker/images/n8n/README.md @@ -19,6 +19,7 @@ so also used with internal tools. - [Securing n8n](#securing-n8n) - [Persist data](#persist-data) - [Passing Sensitive Data via File](#passing-sensitive-data-via-file) +- [Example Setup with Lets Encrypt](#example-setup-with-lets-encrypt) - [What does n8n mean and how do you pronounce it](#what-does-n8n-mean-and-how-do-you-pronounce-it) - [Support](#support) - [Upgrading](#upgrading) @@ -193,6 +194,12 @@ The following environment variables support file input: - N8N_BASIC_AUTH_USER_FILE +## Example Setup with Lets Encrypt + +A basic step by step example setup of n8n with docker-compose and Lets Encrypt is available on the +[Server Setup](https://docs.n8n.io/#/server-setup) page. + + ## Setting Timezone To define the timezone n8n should use, the environment variable `GENERIC_TIMEZONE` can diff --git a/docs/docker.md b/docs/docker.md index c092104f5..5b400820d 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -2,3 +2,6 @@ Detailed information about how to run n8n in Docker can be found in the README of the [Docker Image](https://github.com/n8n-io/n8n/blob/master/docker/images/n8n/README.md). + +A basic step by step example setup of n8n with docker-compose and Lets Encrypt is available on the +[Server Setup](server-setup.md) page. From e4f08382f261792241a7e0b9f54d3183e2708c15 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 7 Nov 2019 21:06:30 +0100 Subject: [PATCH 49/66] :books: Add documentation for Function-Nodes and about Data Structure --- docs/_sidebar.md | 2 + docs/data-structure.md | 39 +++++++++ docs/node-basics.md | 72 ++++++++++++++++ docs/nodes.md | 189 +++++++++++++++++++++++++++++++---------- 4 files changed, 255 insertions(+), 47 deletions(-) create mode 100644 docs/data-structure.md create mode 100644 docs/node-basics.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 01cdf780d..e92096e1e 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -13,8 +13,10 @@ - Advanced - [Configuration](configuration.md) + - [Data Structure](data-structure.md) - [Database](database.md) - [Keyboard Shortcuts](keyboard-shortcuts.md) + - [Node Basics](node-basics.md) - [Nodes](nodes.md) - [Security](security.md) - [Sensitive Data](sensitive-data.md) diff --git a/docs/data-structure.md b/docs/data-structure.md new file mode 100644 index 000000000..e6a6917f6 --- /dev/null +++ b/docs/data-structure.md @@ -0,0 +1,39 @@ +# Data Structure + +For "basic usage" it is not necessarily needed to understand how the data is structured +which gets passed from one node to another. It becomes however important if you want to: + + - create an own node + - write custom expressions + - use the Function or Function Item Node + - you want to get the most out of n8n in general + + +In n8n all data passed between nodes is an array of objects. It has the structure below: + +```json +[ + { + // Each item has to contain a "json" property. But it can be an empty object like {}. + // Any kind of JSON data is allowed. So arrays and the data being deeply nested is fine. + json: { // The actual data n8n operates on (required) + // This data is only an example it could be any kind of JSON data + jsonKeyName: 'keyValue', + anotherJsonKey: { + lowerLevelJsonKey: 1 + } + }, + // Binary data of item. The most items in n8n do not contain any (optional) + binary: { + // The key-name "binaryKeyName" is only an example. Any kind of key-name is possible. + binaryKeyName: { + data: '....', // Base64 encoded binary data (required) + mimeType: 'image/png', // Optional but should be set if possible (optional) + fileExtension: 'png', // Optional but should be set if possible (optional) + fileName: 'example.png', // Optional but should be set if possible (optional) + } + } + }, + ... +] +``` diff --git a/docs/node-basics.md b/docs/node-basics.md new file mode 100644 index 000000000..c479e62e9 --- /dev/null +++ b/docs/node-basics.md @@ -0,0 +1,72 @@ +# Node Basics + + +## Types + +There are two main node types in n8n Trigger- and Regular-Nodes. + + +### Trigger Nodes + +The Trigger-Nodes start a workflow and supply the initial data. A workflow can contain multiple trigger nodes but with each execution, just one of them will execute as they do not have any input and they are the nodes from which the execution starts. + + +### Regular Nodes + +These nodes do the actual “work”. They can add, remove and edit the data in the flow, request and send data to external APIs and can do everything possible with Node.js in general. + + +## Credentials + +External services need a way to identify and authenticate users. That data, which can range from API key over email/password combination to a very long multi-line private key, get saved in n8n as credentials. + +To make sure that the data is secure, it gets saved to the database encrypted. As encryption key does a random personal encryption key gets used which gets automatically generated on the first start of n8n and then saved under `~/.n8n/config`. + +Nodes in n8n can then request that credential information. As an additional layer of security can credentials only be accessed by node types which specifically got the right to do so. + + +## Expressions + +With the help of expressions, it is possible to set node parameters dynamically by referencing other data. That can be data from the flow, nodes, the environment or self-generated data. They are normal text with placeholders (everything between {{...}}) that can execute JavaScript code which offers access to special variables to access data. + +An expression could look like this: + +My name is: `{{$node["Webhook"].data["query"]["name"]}}` + +This one would return "My name is: " and then attach the value that the node with the name "Webhook" outputs and there select the property "query" and its key "name". So if the node would output this data: + +```json +{ + "query": { + "name": "Jim" + } +} +``` + +the value would be: "My name is: Jim" + +The following special variables are available: + + - **$binary**: Incoming binary data of a node + - **$data**: Incoming JSON data of a node + - **$env**: Environment variables + - **$node**: Data of other nodes (output-data, parameters) + - **$parameters**: Parameters of the current node + +Normally it is not needed to write the JavaScript variables manually as they can be simply selected with the help of the Expression Editor. + + +## Parameters + +On the most nodes in n8n parameters can be set. The values that get set define what exactly a node does. + +That values which are set are by default static and are always the same no matter what data they process. It is however also possible to set the values dynamically with the help of Expressions. With them, it is possible to make the value depending on other factors like the data of flow or parameters of other nodes. + +More information about it can be found under [Expressions](#expressions). + + +## Pausing Node + +Sometimes when creating and debugging a workflow it is helpful to not execute some specific nodes. To make that as simple as possible and not having to disconnect each node, it is possible to pause them. When a node gets paused the data simple passes through the node without being changed. + +There are two ways to pause a node. Either pressing the pause button which gets displayed above the node when hovering over it. Or by selecting the node and pressing “d”. diff --git a/docs/nodes.md b/docs/nodes.md index 5163bf866..cf2484c6c 100644 --- a/docs/nodes.md +++ b/docs/nodes.md @@ -1,72 +1,167 @@ -# Node +# Nodes + +## Function and Function Item Node + +These are the most powerful nodes in n8n. With these, almost everything can be done if you know how to +write JavaScript code. Both nodes work very similarly. They simply give you access to the incoming data +and you can manipulate it. -## Types +### Difference between both nodes -There are two main node types in n8n Trigger- and Regular-Nodes. +The difference is that the code of the Function-Node does get executed only once and it receives the +full items (JSON and binary data) as an array and expects as return value again an array of items. The items +returned can be totally different from the incoming ones. So is it not just possible to remove and edit +existing items it is also possible to add or return totally new ones. + +The code of the Function Item-Node on the other does get executed once for every item. It receives +as input one item at a time and also just the JSON data. As a return value, it again expects the JSON data +of one single item. That makes it possible to very easily add, remove and edit JSON properties of items +but it is not possible to add new or remove existing items. Accessing and changing binary data is only +possible via the methods `getBinaryData` and `setBinaryData`. + +Both nodes support promises. So instead of returning the item or items directly, it is also possible to +return a promise which resolves accordingly. -### Trigger Nodes +### Function-Node -The Trigger-Nodes start a workflow and supply the initial data. A workflow can contain multiple trigger nodes but with each execution, just one of them will execute as they do not have any input and they are the nodes from which the execution starts. +#### Variable: items +It contains all the items the node received as input. -### Regular Nodes +Information about how the data is structured can be found on the page [Data Structure](data-structure.md) -These nodes do the actual “work”. They can add, remove and edit the data in the flow, request and send data to external APIs and can do everything possible with Node.js in general. +The data can be accessed and manipulated like this: +```typescript +// Sets the JSON data property "myFileName" of the first item to the name of the +// file which is set in the binary property "image" of the same item. +items[0].json.myFileName = items[0].binary.image.fileName; -## Credentials - -External services need a way to identify and authenticate users. That data, which can range from API key over email/password combination to a very long multi-line private key, get saved in n8n as credentials. - -To make sure that the data is secure, it gets saved to the database encrypted. As encryption key does a random personal encryption key gets used which gets automatically generated on the first start of n8n and then saved under `~/.n8n/config`. - -Nodes in n8n can then request that credential information. As an additional layer of security can credentials only be accessed by node types which specifically got the right to do so. - - -## Expressions - -With the help of expressions, it is possible to set node parameters dynamically by referencing other data. That can be data from the flow, nodes, the environment or self-generated data. They are normal text with placeholders (everything between {{...}}) that can execute JavaScript code which offers access to special variables to access data. - -An expression could look like this: - -My name is: `{{$node["Webhook"].data["query"]["name"]}}` - -This one would return "My name is: " and then attach the value that the node with the name "Webhook" outputs and there select the property "query" and its key "name". So if the node would output this data: - -```json -{ - "query": { - "name": "Jim" - } -} +return items; ``` -the value would be: "My name is: Jim" +This example creates 10 dummy items with the ids 0 to 9: -The following special variables are available: +```typescript +const newItems = []; - - **$binary**: Incoming binary data of a node - - **$data**: Incoming JSON data of a node - - **$env**: Environment variables - - **$node**: Data of other nodes (output-data, parameters) - - **$parameters**: Parameters of the current node +for (let i=0;i<10;i++) { + newItems.push({ + json: { + id: i + } + }); +} -Normally it is not needed to write the JavaScript variables manually as they can be simply selected with the help of the Expression Editor. +return newItems; +``` -## Parameters +#### Method: $item(index) -On the most nodes in n8n parameters can be set. The values that get set define what exactly a node does. +With `$item` it is possible to access the data of parent nodes. That can be the item data but also +the parameters. It expects as input an index of the item the data should be returned for. This is +needed because for each item the data returned can be different. This is probably obvious for the +item data itself but maybe less for data like parameters. The reason why it is also needed there is +that they may contain an expression. Expressions get always executed of the context for an item. +If that would not be the case, for example, the Email Send-Node not would be able to send multiple +emails at once to different people. Instead, the same person would receive multiple emails. -That values which are set are by default static and are always the same no matter what data they process. It is however also possible to set the values dynamically with the help of Expressions. With them, it is possible to make the value depending on other factors like the data of flow or parameters of other nodes. +The index is 0 based. So `$item(0)` will return the first item, `$item(1)` the second one, ... -More information about it can be found under [Expressions](#expressions). +Example: + +```typescript +// Returns the value of the JSON data property "myNumber" of Node "Set" (first item) +const myNumber = $item(0).$node["Set"].data["myNumber"]; +// Like above but data of the 6th item +const myNumber = $item(5).$node["Set"].data["myNumber"]; + +// Returns the value of the parameter "channel" of Node "Slack". +// If it contains an expression the value will be resolved with the +// data of the first item. +const channel = $item(0).$node["Slack"].parameter["channel"]; +// Like above but resolved with the value of the 10th item. +const channel = $item(9).$node["Slack"].parameter["channel"]; +``` -## Pausing Node +#### Variable: $node -Sometimes when creating and debugging a workflow it is helpful to not execute some specific nodes. To make that as simple as possible and not having to disconnect each node, it is possible to pause them. When a node gets paused the data simple passes through the node without being changed. +Works exactly like `$item` with the difference that it will always return the data of the first item. -There are two ways to pause a node. Either pressing the pause button which gets displayed above the node when hovering over it. Or by selecting the node and pressing “d”. +```typescript +const myNumber = $node["Set"].data['myNumber']; + +const channel = $node["Slack"].parameter["channel"]; +``` + + +#### Method: getWorkflowStaticData(type) + +Gives access to the static workflow data. +It is possible to save data directly with the workflow. This data should, however, be very small. +A common use case is to for example to save a timestamp of the last item that got processed from +an RSS-Feed or database. It will always return an object. Properties can then read, deleted or +set on that object. When the workflow execution did succeed n8n will check automatically if data +changed and will save it if necessary. + +There are two types of static data. The "global" and the "node" one. Global static data is the +same in the whole workflow. And every node in the workflow can access it. The node static data +, however, is different for every node and only the node which did set it can retrieve it again. + +Example: + +```typescript +// Get the global workflow static data +const staticData = getWorkflowStaticData('global'); +// Get the static data of the node +const staticData = getWorkflowStaticData('node'); + +// Access its data +const lastExecution = staticData.lastExecution; + +// Update its data +staticData.lastExecution = new Date().getTime(); + +// Delete data +delete staticData.lastExecution; +``` + +It is important to know that static data can not be read and written when testing via the UI. +The data will there always be empty and changes will not be persisted. Only when a workflow +is active and it gets called by a Trigger or Webhook will the static data be saved. + + + +### Function Item-Node + + +#### Variable: item + +It contains the "json" data of the currently processed item. + +The data can be accessed and manipulated like this: + +```json +// Uses the data of an already existing key to create a new additional one +item.newIncrementedCounter = item.existingCounter + 1; +return item; +``` + + +#### Method: getBinaryData() + +Returns all the binary data (all keys) of the item which gets currently processed. + + +#### Method: setBinaryData(binaryData) + +Sets all the binary data (all keys) of the item which gets currently processed. + + +#### Method: getWorkflowStaticData(type) + +As described above for Function-Node. From 98ac7f3cc11112d9ce6e82eb0aa9e045ea9b7001 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 7 Nov 2019 21:20:08 +0100 Subject: [PATCH 50/66] :zap: Remove not needed import --- .../nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts b/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts index 2b82d6beb..e962e4041 100644 --- a/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts +++ b/packages/nodes-base/nodes/ActiveCampaign/ConnectionDescription.ts @@ -1,7 +1,5 @@ import { INodeProperties } from "n8n-workflow"; -import { allCurrencies } from './currencies'; - export const connectionOperations = [ { displayName: 'Operation', @@ -321,4 +319,4 @@ export const connectionFields = [ default: 100, description: 'How many results to return.', }, -] as INodeProperties[]; \ No newline at end of file +] as INodeProperties[]; From 226e8467f437d87d7bd66a8f9fd65fc465b546be Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 7 Nov 2019 22:13:51 +0100 Subject: [PATCH 51/66] :bookmark: Release n8n-nodes-base@0.29.0 --- packages/nodes-base/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 6af0a99a5..3d91f5ce6 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -1,6 +1,6 @@ { "name": "n8n-nodes-base", - "version": "0.28.0", + "version": "0.29.0", "description": "Base nodes of n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 72341a425eef4d983c3b2addd5bbb310e6e0463c Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 7 Nov 2019 22:15:17 +0100 Subject: [PATCH 52/66] :bookmark: Release n8n-editor-ui@0.25.0 --- packages/editor-ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 911257526..193e6cf8d 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -1,6 +1,6 @@ { "name": "n8n-editor-ui", - "version": "0.24.0", + "version": "0.25.0", "description": "Workflow Editor UI for n8n", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From 72f0fcfa87a10263cb12aca21e4ccad0794851b6 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 7 Nov 2019 22:17:17 +0100 Subject: [PATCH 53/66] :arrow_up: Set n8n-editor-ui@0.25.0, n8n-nodes-base@0.29.0 on n8n --- packages/cli/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index ad4bde475..59055984e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -90,8 +90,8 @@ "localtunnel": "^1.9.1", "mongodb": "^3.2.3", "n8n-core": "~0.14.0", - "n8n-editor-ui": "~0.24.0", - "n8n-nodes-base": "~0.28.0", + "n8n-editor-ui": "~0.25.0", + "n8n-nodes-base": "~0.29.0", "n8n-workflow": "~0.15.0", "open": "^6.1.0", "pg": "^7.11.0", From 1cf21a88588e89f72c12974cde840fd27a82a4c9 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Thu, 7 Nov 2019 22:18:27 +0100 Subject: [PATCH 54/66] :bookmark: Release n8n@0.34.0 --- packages/cli/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 59055984e..a7798fab7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "n8n", - "version": "0.33.0", + "version": "0.34.0", "description": "n8n Workflow Automation Tool", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://n8n.io", From c23b6ed90471f3593afb2ffec647794d6c8dc5c6 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 8 Nov 2019 07:18:01 +0100 Subject: [PATCH 55/66] :zap: Improve error reporting on expression error --- packages/core/src/NodeExecuteFunctions.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/core/src/NodeExecuteFunctions.ts b/packages/core/src/NodeExecuteFunctions.ts index 58e1e320d..344abf9f8 100644 --- a/packages/core/src/NodeExecuteFunctions.ts +++ b/packages/core/src/NodeExecuteFunctions.ts @@ -220,7 +220,13 @@ export function getNodeParameter(workflow: Workflow, runExecutionData: IRunExecu throw new Error(`Could not get parameter "${parameterName}"!`); } - const returnData = workflow.getParameterValue(value, runExecutionData, runIndex, itemIndex, node.name, connectionInputData); + let returnData; + try { + returnData = workflow.getParameterValue(value, runExecutionData, runIndex, itemIndex, node.name, connectionInputData); + } catch (e) { + e.message += ` [Error in parameter: "${parameterName}"]`; + throw e; + } return returnData; } From 021762c74e660969b975aeb297d02dfc39beaa8a Mon Sep 17 00:00:00 2001 From: mtahiue Date: Fri, 8 Nov 2019 12:41:47 +0100 Subject: [PATCH 56/66] Added due_date to gitlab create and edit issue --- .../nodes-base/nodes/Gitlab/Gitlab.node.ts | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts b/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts index bcf5712a8..b83206244 100644 --- a/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts +++ b/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts @@ -317,7 +317,31 @@ export class Gitlab implements INodeType { }, ], }, - + { + displayName: 'Due Date', + name: 'date_date', + type: 'string', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'issue', + ], + }, + }, + default: { 'due_date': '' }, + options: [ + { + displayName: 'Due Date', + name: 'date_date', + type: 'string', + default: 0, + description: 'Due Date for issue. Date time string in the format YEAR-MONTH-DAY, e.g. 2016-03-11', + }, + ], + }, // ---------------------------------- // issue:createComment // ---------------------------------- @@ -474,6 +498,13 @@ export class Gitlab implements INodeType { }, ], }, + { + displayName: 'Due Date', + name: 'due_date', + type: 'string', + default: '', + description: 'The Due Date of the issue. Date time string in the format YEAR-MONTH-DAY, e.g. 2016-03-11', + }, ], }, From bea9fd033b944fa2ad9e8a7b8f727b79af16c92f Mon Sep 17 00:00:00 2001 From: mtahiue Date: Fri, 8 Nov 2019 15:10:45 +0100 Subject: [PATCH 57/66] Fixed name of description field --- packages/nodes-base/nodes/Gitlab/Gitlab.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts b/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts index b83206244..47ac63b32 100644 --- a/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts +++ b/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts @@ -241,7 +241,7 @@ export class Gitlab implements INodeType { }, { displayName: 'Body', - name: 'body', + name: 'description', type: 'string', typeOptions: { rows: 5, From 2a54958c0f01a3dfc49d56eeec6b0936c380564c Mon Sep 17 00:00:00 2001 From: mtahiue Date: Fri, 8 Nov 2019 15:13:48 +0100 Subject: [PATCH 58/66] Fixed name of description field for edit --- packages/nodes-base/nodes/Gitlab/Gitlab.node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts b/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts index 47ac63b32..979bef8f7 100644 --- a/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts +++ b/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts @@ -433,7 +433,7 @@ export class Gitlab implements INodeType { }, { displayName: 'Body', - name: 'body', + name: 'description', type: 'string', typeOptions: { rows: 5, From c478fd9ddb1abfc7f2ebf12fc75c8a13b0e92106 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Fri, 8 Nov 2019 10:41:10 -0500 Subject: [PATCH 59/66] done --- .../nodes/Freshdesk/Freshdesk.node.ts | 340 ++++++++++++------ .../nodes/Freshdesk/GenericFunctions.ts | 16 +- 2 files changed, 254 insertions(+), 102 deletions(-) diff --git a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts index 7dbeb88a6..3fb530faa 100644 --- a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts +++ b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts @@ -10,7 +10,9 @@ import { INodePropertyOptions, } from 'n8n-workflow'; import { - freshdeskApiRequest + freshdeskApiRequest, + validateJSON, + capitalize } from './GenericFunctions'; enum Status { @@ -34,7 +36,7 @@ enum Source { Chat = 4, Mobihelp = 5, FeedbackWidget = 6, - OutboundEmail =7 + OutboundEmail = 7 } interface ICreateTicketBody { @@ -45,7 +47,7 @@ interface ICreateTicketBody { phone?: string; twitter_id?: string; unique_external_id?: string; - subject?: string; + subject?: string | null; type?: string; status: Status; priority: Priority; @@ -59,8 +61,8 @@ interface ICreateTicketBody { group_id?: number; product_id?: number; source: Source; - tags: [string]; - company_id: number; + tags?: [string]; + company_id?: number; } export class Freshdesk implements INodeType { @@ -310,23 +312,23 @@ export class Freshdesk implements INodeType { default: 'portal', description: 'The channel through which the ticket was created.', }, - { - displayName: 'JSON Parameters', - name: 'jsonParameters', - type: 'boolean', - default: false, - description: '', - displayOptions: { - show: { - resource: [ - 'ticket' - ], - operation: [ - 'create', - ] - }, - }, - }, + // { + // displayName: 'JSON Parameters', + // name: 'jsonParameters', + // type: 'boolean', + // default: false, + // description: '', + // displayOptions: { + // show: { + // resource: [ + // 'ticket' + // ], + // operation: [ + // 'create', + // ] + // }, + // }, + // }, { displayName: 'Options', name: 'options', @@ -363,9 +365,31 @@ export class Freshdesk implements INodeType { { displayName: 'Type', name: 'type', - type: 'string', - default: '', + type: 'options', + default: 'Question', description: 'Helps categorize the ticket according to the different kinds of issues your support team deals with.', + options: [ + { + name: 'Question', + value: 'Question' + }, + { + name: 'Incident', + value: 'Incident' + }, + { + name: 'Problem', + value: 'Problem' + }, + { + name: 'Feature Request', + value: 'Feature Request' + }, + { + name: 'Refund', + value: 'Refund' + }, + ] }, { displayName: 'Description', @@ -426,7 +450,7 @@ export class Freshdesk implements INodeType { { displayName: 'FR Due By', name: 'frDueBy', - type: 'number', + type: 'dateTime', required: false, default: '', description: `Timestamp that denotes when the first response is due`, @@ -467,80 +491,80 @@ export class Freshdesk implements INodeType { }, ] }, - { - displayName: 'Custom Fields', - name: 'customFieldsUi', - placeholder: 'Add Custom fields', - type: 'fixedCollection', - required: false, - default: '', - typeOptions: { - multipleValues: true, - }, - displayOptions: { - show: { - resource: [ - 'ticket' - ], - operation: [ - 'create' - ], - jsonParameters: [ - false, - ], - }, - }, - description: 'Key value pairs containing the names and values of custom fields.', - options: [ - { - name: 'customFieldsValues', - displayName: 'Custom fields', - values: [ - { - displayName: 'Key', - required: false, - name: 'key', - type: 'string', - default: '', - }, - { - displayName: 'Value', - name: 'value', - type: 'string', - required: false, - default: '', - }, - ], - }, - ], - }, - { - displayName: 'Custom Fields', - name: 'customFieldsJson', - type: 'json', - typeOptions: { - alwaysOpenEditWindow: true, - }, - displayOptions: { - show: { - resource: [ - 'ticket' - ], - operation: [ - 'create' - ], - jsonParameters: [ - true, - ], - }, - }, - default: '', - required: false, - placeholder: `{ - "gadget":"Cold Welder" - }`, - description: 'Key value pairs containing the names and values of custom fields.', - }, + // { + // displayName: 'Custom Fields', + // name: 'customFieldsUi', + // placeholder: 'Add Custom fields', + // type: 'fixedCollection', + // required: false, + // default: '', + // typeOptions: { + // multipleValues: true, + // }, + // displayOptions: { + // show: { + // resource: [ + // 'ticket' + // ], + // operation: [ + // 'create' + // ], + // jsonParameters: [ + // false, + // ], + // }, + // }, + // description: 'Key value pairs containing the names and values of custom fields.', + // options: [ + // { + // name: 'customFieldsValues', + // displayName: 'Custom fields', + // values: [ + // { + // displayName: 'Key', + // required: false, + // name: 'key', + // type: 'string', + // default: '', + // }, + // { + // displayName: 'Value', + // name: 'value', + // type: 'string', + // required: false, + // default: '', + // }, + // ], + // }, + // ], + // }, + // { + // displayName: 'Custom Fields', + // name: 'customFieldsJson', + // type: 'json', + // typeOptions: { + // alwaysOpenEditWindow: true, + // }, + // displayOptions: { + // show: { + // resource: [ + // 'ticket' + // ], + // operation: [ + // 'create' + // ], + // jsonParameters: [ + // true, + // ], + // }, + // }, + // default: '', + // required: false, + // placeholder: `{ + // "gadget":"Cold Welder" + // }`, + // description: 'Key value pairs containing the names and values of custom fields.', + // }, ] }; @@ -637,10 +661,124 @@ export class Freshdesk implements INodeType { }; async executeSingle(this: IExecuteSingleFunctions): Promise { + const resource = this.getNodeParameter('resource') as string; + const opeation = this.getNodeParameter('operation') as string; + let response; + + if (resource === 'ticket') { + if (opeation === 'create') { + const requester = this.getNodeParameter('requester') as string; + const value = this.getNodeParameter('requesterIdentificationValue') as string; + const status = this.getNodeParameter('status') as string; + const priority = this.getNodeParameter('priority') as string; + const source = this.getNodeParameter('source') as string; + const options = this.getNodeParameter('options') as IDataObject; + //const jsonActive = this.getNodeParameter('jsonParameters') as boolean; + + const body: ICreateTicketBody = { + // @ts-ignore + status: Status[capitalize(status)], + // @ts-ignore + priority: Priority[capitalize(priority)], + // @ts-ignore + source: Source[capitalize(source)] + }; + + if (requester === 'requesterId') { + // @ts-ignore + if (isNaN(value)) { + throw new Error('Requester Id must be a number'); + } + body.requester_id = parseInt(value, 10); + } else if (requester === 'email'){ + body.email = value; + } else if (requester === 'facebookId'){ + body.facebook_id = value; + } else if (requester === 'phone'){ + body.phone = value; + } else if (requester === 'twitterId'){ + body.twitter_id = value; + } else if (requester === 'uniqueExternalId'){ + body.unique_external_id = value; + } + + // if (!jsonActive) { + // const customFieldsUi = this.getNodeParameter('customFieldsUi') as IDataObject; + // if (Object.keys(customFieldsUi).length > 0) { + // const aux: IDataObject = {}; + // // @ts-ignore + // customFieldsUi.customFieldsValues.forEach( o => { + // aux[`${o.key}`] = o.value; + // return aux; + // }); + // body.custom_fields = aux; + // } else { + // body.custom_fields = validateJSON(this.getNodeParameter('customFielsJson') as string); + // } + + if (options.name) { + body.name = options.name as string; + } + + if (options.subject) { + body.subject = options.subject as string; + } else { + body.subject = 'null'; + } + + if (options.type) { + body.type = options.type as string; + } + + if (options.description) { + body.description = options.description as string; + } else { + body.description = 'null'; + } + + if (options.agent) { + options.responder_id = options.agent as number; + } + + if (options.company) { + options.company_id = options.company as number; + } + + if (options.product) { + options.product_id = options.product as number; + } + + if (options.group) { + options.group_id = options.group as number; + } + + if (options.frDueBy) { + options.fr_due_by = options.frDueBy as string; + } + + if (options.emailConfigId) { + options.email_config_id = options.emailConfigId as number; + } + + if (options.dueBy) { + options.due_by = options.dueBy as string; + } + + if (options.ccEmails) { + // @ts-ignore + options.cc_emails = options.ccEmails.split(',') as [string]; + } + + try { + response = await freshdeskApiRequest.call(this, '/tickets', 'POST', body); + } catch (err) { + throw new Error(`Freskdesk Error: ${JSON.stringify(err)}`); + } + } + } return { - json: {} + json: response }; - } } diff --git a/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts index acab34f81..ea25ccadc 100644 --- a/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts @@ -9,7 +9,6 @@ import { } from 'n8n-core'; import * as _ from 'lodash'; -import { IDataObject } from 'n8n-workflow'; export async function freshdeskApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, resource: string, method: string, body: any = {}, headers?: object): Promise { // tslint:disable-line:no-any @@ -50,3 +49,18 @@ export async function freshdeskApiRequest(this: IHookFunctions | IExecuteFunctio throw error.response.body; } } + +export function validateJSON(json: string | undefined): any { // tslint:disable-line:no-any + let result; + try { + result = JSON.parse(json!); + } catch (exception) { + result = []; + } + return result; +} + +export function capitalize (s: string) : string { + if (typeof s !== 'string') return ''; + return s.charAt(0).toUpperCase() + s.slice(1); +} From f60b8e33f759678b98acc7f679c87360f46c372b Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Fri, 8 Nov 2019 11:26:09 -0500 Subject: [PATCH 60/66] sync master upstream --- .../nodes/Freshdesk/Freshdesk.node.ts | 784 ++++++++++++++++++ 1 file changed, 784 insertions(+) create mode 100644 packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts diff --git a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts new file mode 100644 index 000000000..3fb530faa --- /dev/null +++ b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts @@ -0,0 +1,784 @@ +import { + IExecuteSingleFunctions, +} from 'n8n-core'; +import { + IDataObject, + INodeTypeDescription, + INodeExecutionData, + INodeType, + ILoadOptionsFunctions, + INodePropertyOptions, +} from 'n8n-workflow'; +import { + freshdeskApiRequest, + validateJSON, + capitalize +} from './GenericFunctions'; + +enum Status { + Open = 1, + Pending = 2, + Resolved = 3, + Closed = 4 +} + +enum Priority { + Low = 1, + Medium = 2, + High = 3, + Urgent = 4 +} + +enum Source { + Email = 1, + Portal = 2, + Phone = 3, + Chat = 4, + Mobihelp = 5, + FeedbackWidget = 6, + OutboundEmail = 7 +} + +interface ICreateTicketBody { + name?: string; + requester_id?: number; + email?: string; + facebook_id?: string; + phone?: string; + twitter_id?: string; + unique_external_id?: string; + subject?: string | null; + type?: string; + status: Status; + priority: Priority; + description?: string; + responder_id?: number; + cc_emails?: [string]; + custom_fields?: IDataObject; + due_by?: string; + email_config_id?: number; + fr_due_by?: string; + group_id?: number; + product_id?: number; + source: Source; + tags?: [string]; + company_id?: number; +} + +export class Freshdesk implements INodeType { + + description: INodeTypeDescription = { + displayName: 'Freshdesk', + name: 'freshdesk', + icon: 'file:freshdesk.png', + group: ['output'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Consume Freshdesk API', + defaults: { + name: 'Freshdesk', + color: '#c02428', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'freshdeskApi', + required: true, + } + ], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + required: true, + options: [ + { + name: 'Ticket', + value: 'ticket', + }, + ], + default: 'ticket', + description: 'The resource to operate on.', + }, + { + displayName: 'Operation', + name: 'operation', + type: 'options', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ] + }, + }, + options: [ + { + name: 'Create', + value: 'create', + description: 'Create a new ticket', + } + ], + default: 'create', + description: 'The operation to perform.', + }, + { + displayName: 'Requester Identification', + name: 'requester', + type: 'options', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ], + operation: [ + 'create' + ] + }, + }, + options: [ + { + name: 'Requester Id', + value: 'requesterId', + description: `User ID of the requester. For existing contacts, the requester_id can be passed instead of the requester's email.`, + }, + { + name: 'Email', + value: 'email', + description: `Email address of the requester. If no contact exists with this email address in Freshdesk, it will be added as a new contact.`, + }, + { + name: 'Facebook Id', + value: 'facebookId', + description: `Facebook ID of the requester. If no contact exists with this facebook_id, then a new contact will be created.`, + }, + { + name: 'Phone', + value: 'phone', + description: `Phone number of the requester. If no contact exists with this phone number in Freshdesk, it will be added as a new contact. If the phone number is set and the email address is not, then the name attribute is mandatory.`, + }, + { + name: 'Twitter Id', + value: 'twitterId', + description: `Twitter handle of the requester. If no contact exists with this handle in Freshdesk, it will be added as a new contact.`, + }, + { + name: 'Unique External Id', + value: 'uniqueExternalId', + description: `External ID of the requester. If no contact exists with this external ID in Freshdesk, they will be added as a new contact.`, + }, + ], + default: 'requesterId', + description: 'Requester Identification', + }, + { + displayName: 'Value', + name: 'requesterIdentificationValue', + type: 'string', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ], + operation: [ + 'create' + ] + }, + }, + default: '', + description: `Value of the identification selected `, + }, + { + displayName: 'Status', + name: 'status', + type: 'options', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ], + operation: [ + 'create' + ] + }, + }, + options: [ + { + name: 'Open', + value: 'open', + }, + { + name: 'Pending', + value: 'pending', + }, + { + name: 'Resolved', + value: 'resolved', + }, + { + name: 'Closed', + value: 'closed', + } + ], + default: 'pending', + description: 'Status', + }, + { + displayName: 'Priority', + name: 'priority', + type: 'options', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ], + operation: [ + 'create' + ] + }, + }, + options: [ + { + name: 'Low', + value: 'low', + }, + { + name: 'Medium', + value: 'medium', + }, + { + name: 'High', + value: 'high', + }, + { + name: 'Urgent', + value: 'urgent', + } + ], + default: 'low', + description: 'Priority', + }, + { + displayName: 'Source', + name: 'source', + type: 'options', + required: true, + displayOptions: { + show: { + resource: [ + 'ticket', + ], + operation: [ + 'create' + ] + }, + }, + options: [ + { + name: 'Email', + value: 'email', + }, + { + name: 'Portal', + value: 'portal', + }, + { + name: 'Phone', + value: 'phone', + }, + { + name: 'Chat', + value: 'chat', + }, + { + name: 'Mobihelp', + value: 'mobileHelp', + }, + { + name: 'Feedback Widget', + value: 'feedbackWidget', + }, + { + name: 'Outbound Email', + value: 'OutboundEmail', + } + ], + default: 'portal', + description: 'The channel through which the ticket was created.', + }, + // { + // displayName: 'JSON Parameters', + // name: 'jsonParameters', + // type: 'boolean', + // default: false, + // description: '', + // displayOptions: { + // show: { + // resource: [ + // 'ticket' + // ], + // operation: [ + // 'create', + // ] + // }, + // }, + // }, + { + displayName: 'Options', + name: 'options', + type: 'collection', + placeholder: 'Add Option', + default: {}, + displayOptions: { + show: { + resource: [ + 'ticket' + ], + operation: [ + 'create' + ], + }, + }, + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + placeholder: '', + description: 'Name of the requester', + }, + { + displayName: 'Subject', + name: 'subject', + type: 'string', + default: '', + placeholder: '', + description: 'Subject of the ticket.', + }, + { + displayName: 'Type', + name: 'type', + type: 'options', + default: 'Question', + description: 'Helps categorize the ticket according to the different kinds of issues your support team deals with.', + options: [ + { + name: 'Question', + value: 'Question' + }, + { + name: 'Incident', + value: 'Incident' + }, + { + name: 'Problem', + value: 'Problem' + }, + { + name: 'Feature Request', + value: 'Feature Request' + }, + { + name: 'Refund', + value: 'Refund' + }, + ] + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + required: false, + default: '', + typeOptions: { + rows: 5, + alwaysOpenEditWindow: true, + }, + description: 'HTML content of the ticket.', + }, + { + displayName: 'Agent', + name: 'agent', + type: 'options', + required: false, + default: '', + typeOptions: { + loadOptionsMethod: 'getAgents' + }, + description: 'ID of the agent to whom the ticket has been assigned', + }, + { + displayName: 'CC Emails', + name: 'ccEmails', + required: false, + type: 'string', + default: '', + description: `separated by , email addresses added in the 'cc' field of the incoming ticket email`, + }, + { + displayName: 'Tags', + name: 'tags', + required: false, + type: 'string', + default: '', + description: `separated by , tags that have been associated with the ticket`, + }, + { + displayName: 'Due By', + name: 'dueBy', + required: false, + type: 'dateTime', + default: '', + description: `Timestamp that denotes when the ticket is due to be resolved`, + }, + { + displayName: 'Email config Id', + name: 'emailConfigId', + type: 'number', + required: false, + default: '', + description: `ID of email config which is used for this ticket. (i.e., support@yourcompany.com/sales@yourcompany.com) + If product_id is given and email_config_id is not given, product's primary email_config_id will be set`, + }, + { + displayName: 'FR Due By', + name: 'frDueBy', + type: 'dateTime', + required: false, + default: '', + description: `Timestamp that denotes when the first response is due`, + }, + { + displayName: 'Group', + name: 'group', + required: false, + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getGroups' + }, + description: `ID of the group to which the ticket has been assigned. The default value is the ID of the group that is associated with the given email_config_id`, + }, + { + displayName: 'Product', + name: 'product', + required: false, + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getProducts' + }, + description: `ID of the product to which the ticket is associated. + It will be ignored if the email_config_id attribute is set in the request.`, + }, + { + displayName: 'Company', + name: 'company', + required: false, + type: 'options', + default: '', + typeOptions: { + loadOptionsMethod: 'getCompanies' + }, + description: `Company ID of the requester. This attribute can only be set if the Multiple Companies feature is enabled (Estate plan and above)`, + }, + ] + }, + // { + // displayName: 'Custom Fields', + // name: 'customFieldsUi', + // placeholder: 'Add Custom fields', + // type: 'fixedCollection', + // required: false, + // default: '', + // typeOptions: { + // multipleValues: true, + // }, + // displayOptions: { + // show: { + // resource: [ + // 'ticket' + // ], + // operation: [ + // 'create' + // ], + // jsonParameters: [ + // false, + // ], + // }, + // }, + // description: 'Key value pairs containing the names and values of custom fields.', + // options: [ + // { + // name: 'customFieldsValues', + // displayName: 'Custom fields', + // values: [ + // { + // displayName: 'Key', + // required: false, + // name: 'key', + // type: 'string', + // default: '', + // }, + // { + // displayName: 'Value', + // name: 'value', + // type: 'string', + // required: false, + // default: '', + // }, + // ], + // }, + // ], + // }, + // { + // displayName: 'Custom Fields', + // name: 'customFieldsJson', + // type: 'json', + // typeOptions: { + // alwaysOpenEditWindow: true, + // }, + // displayOptions: { + // show: { + // resource: [ + // 'ticket' + // ], + // operation: [ + // 'create' + // ], + // jsonParameters: [ + // true, + // ], + // }, + // }, + // default: '', + // required: false, + // placeholder: `{ + // "gadget":"Cold Welder" + // }`, + // description: 'Key value pairs containing the names and values of custom fields.', + // }, + ] + }; + + methods = { + loadOptions: { + // Get all the agents to display them to user so that he can + // select them easily + async getAgents(this: ILoadOptionsFunctions): Promise { + const returnData: INodePropertyOptions[] = []; + let agents; + try { + agents = await freshdeskApiRequest.call(this, '/agents', 'GET'); + } catch (err) { + throw new Error(`Freshdesk Error: ${err}`); + } + for (const agent of agents) { + const agentName = agent.contact.name; + const agentId = agent.id; + + returnData.push({ + name: agentName, + value: agentId, + }); + } + return returnData; + }, + + // Get all the groups to display them to user so that he can + // select them easily + async getGroups(this: ILoadOptionsFunctions): Promise { + const returnData: INodePropertyOptions[] = []; + let groups; + try { + groups = await freshdeskApiRequest.call(this, '/groups', 'GET'); + } catch (err) { + throw new Error(`Freshdesk Error: ${err}`); + } + for (const group of groups) { + const groupName = group.name; + const groupId = group.id; + + returnData.push({ + name: groupName, + value: groupId, + }); + } + return returnData; + }, + + // Get all the products to display them to user so that he can + // select them easily + async getProducts(this: ILoadOptionsFunctions): Promise { + const returnData: INodePropertyOptions[] = []; + let products; + try { + products = await freshdeskApiRequest.call(this, '/products', 'GET'); + } catch (err) { + throw new Error(`Freshdesk Error: ${err}`); + } + for (const product of products) { + const productName = product.name; + const productId = product.id; + + returnData.push({ + name: productName, + value: productId, + }); + } + return returnData; + }, + + // Get all the companies to display them to user so that he can + // select them easily + async getCompanies(this: ILoadOptionsFunctions): Promise { + const returnData: INodePropertyOptions[] = []; + let companies; + try { + companies = await freshdeskApiRequest.call(this, '/companies', 'GET'); + } catch (err) { + throw new Error(`Freshdesk Error: ${err}`); + } + for (const company of companies) { + const companyName = company.name; + const companyId = company.id; + + returnData.push({ + name: companyName, + value: companyId, + }); + } + return returnData; + }, + }, + }; + + async executeSingle(this: IExecuteSingleFunctions): Promise { + const resource = this.getNodeParameter('resource') as string; + const opeation = this.getNodeParameter('operation') as string; + let response; + + if (resource === 'ticket') { + if (opeation === 'create') { + const requester = this.getNodeParameter('requester') as string; + const value = this.getNodeParameter('requesterIdentificationValue') as string; + const status = this.getNodeParameter('status') as string; + const priority = this.getNodeParameter('priority') as string; + const source = this.getNodeParameter('source') as string; + const options = this.getNodeParameter('options') as IDataObject; + //const jsonActive = this.getNodeParameter('jsonParameters') as boolean; + + const body: ICreateTicketBody = { + // @ts-ignore + status: Status[capitalize(status)], + // @ts-ignore + priority: Priority[capitalize(priority)], + // @ts-ignore + source: Source[capitalize(source)] + }; + + if (requester === 'requesterId') { + // @ts-ignore + if (isNaN(value)) { + throw new Error('Requester Id must be a number'); + } + body.requester_id = parseInt(value, 10); + } else if (requester === 'email'){ + body.email = value; + } else if (requester === 'facebookId'){ + body.facebook_id = value; + } else if (requester === 'phone'){ + body.phone = value; + } else if (requester === 'twitterId'){ + body.twitter_id = value; + } else if (requester === 'uniqueExternalId'){ + body.unique_external_id = value; + } + + // if (!jsonActive) { + // const customFieldsUi = this.getNodeParameter('customFieldsUi') as IDataObject; + // if (Object.keys(customFieldsUi).length > 0) { + // const aux: IDataObject = {}; + // // @ts-ignore + // customFieldsUi.customFieldsValues.forEach( o => { + // aux[`${o.key}`] = o.value; + // return aux; + // }); + // body.custom_fields = aux; + // } else { + // body.custom_fields = validateJSON(this.getNodeParameter('customFielsJson') as string); + // } + + if (options.name) { + body.name = options.name as string; + } + + if (options.subject) { + body.subject = options.subject as string; + } else { + body.subject = 'null'; + } + + if (options.type) { + body.type = options.type as string; + } + + if (options.description) { + body.description = options.description as string; + } else { + body.description = 'null'; + } + + if (options.agent) { + options.responder_id = options.agent as number; + } + + if (options.company) { + options.company_id = options.company as number; + } + + if (options.product) { + options.product_id = options.product as number; + } + + if (options.group) { + options.group_id = options.group as number; + } + + if (options.frDueBy) { + options.fr_due_by = options.frDueBy as string; + } + + if (options.emailConfigId) { + options.email_config_id = options.emailConfigId as number; + } + + if (options.dueBy) { + options.due_by = options.dueBy as string; + } + + if (options.ccEmails) { + // @ts-ignore + options.cc_emails = options.ccEmails.split(',') as [string]; + } + + try { + response = await freshdeskApiRequest.call(this, '/tickets', 'POST', body); + } catch (err) { + throw new Error(`Freskdesk Error: ${JSON.stringify(err)}`); + } + } + } + + return { + json: response + }; + } +} From 3b2e8867a49fb03be631b0a600d1913705fd2d58 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sat, 9 Nov 2019 13:14:30 +0100 Subject: [PATCH 61/66] :books: Add documentation for some more environment variables --- docs/configuration.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/configuration.md b/docs/configuration.md index 8b5e2160c..51473c0ef 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -6,6 +6,32 @@ It is possible to change some of the n8n defaults via special environment variab The ones that currently exist are: +## Publish + +Sets how n8n should be made available. + +```bash +# The port n8n should be made available on +N8N_PORT=5678 + +# This ones are currently only important for the webhook URL creation. +# So if "WEBHOOK_TUNNEL_URL" got set they do get ignored. It is however +# encouraged to set them correctly anyway in case they will become +# important in the future. +N8N_PROTOCOL=https +N8N_HOST=n8n.example.com +``` + + +## Base URL + +Tells the frontend how to reach the REST API of the backend. + +```bash +export VUE_APP_URL_BASE_API="https://n8n.example.com/" +``` + + ## Execution Data Manual Runs n8n creates a random encryption key automatically on the first launch and saves @@ -99,3 +125,18 @@ user-folder via an environment variable. ```bash export N8N_USER_FOLDER="/home/jim/n8n" ``` + + +## Webhook URL + +The webhook URL will normally be created automatically by combining +`N8N_PROTOCOL`, `N8N_HOST` and `N8N_PORT`. If n8n runs, however, behind a +reverse proxy that would not work. Because n8n does for example run internally +on port 5678 but is exposed to the web via the reverse proxy on port 443. In +that case, it is important to set the webhook URL manually that it can be +displayed correctly in the Editor UI and even more important that the correct +webhook URLs get registred with external services. + +```bash +export WEBHOOK_TUNNEL_URL="https://n8n.example.com/" +``` From ae0ee5ca0127d9c8f0ca3ade3cfe243f4959450d Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sun, 10 Nov 2019 10:17:56 +0100 Subject: [PATCH 62/66] :zap: Fix due_date on Gitlab-Node --- .../nodes-base/nodes/Gitlab/Gitlab.node.ts | 51 +++++++++---------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts b/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts index c37cfd8b8..1f1d0b519 100644 --- a/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts +++ b/packages/nodes-base/nodes/Gitlab/Gitlab.node.ts @@ -241,7 +241,7 @@ export class Gitlab implements INodeType { }, { displayName: 'Body', - name: 'description', + name: 'body', type: 'string', typeOptions: { rows: 5, @@ -259,6 +259,23 @@ export class Gitlab implements INodeType { }, description: 'The body of the issue.', }, + { + displayName: 'Due Date', + name: 'due_date', + type: 'dateTime', + displayOptions: { + show: { + operation: [ + 'create', + ], + resource: [ + 'issue', + ], + }, + }, + default: '', + description: 'Due Date for issue.', + }, { displayName: 'Labels', name: 'labels', @@ -317,31 +334,8 @@ export class Gitlab implements INodeType { }, ], }, - { - displayName: 'Due Date', - name: 'date_date', - type: 'string', - displayOptions: { - show: { - operation: [ - 'create', - ], - resource: [ - 'issue', - ], - }, - }, - default: { 'due_date': '' }, - options: [ - { - displayName: 'Due Date', - name: 'date_date', - type: 'string', - default: 0, - description: 'Due Date for issue. Date time string in the format YEAR-MONTH-DAY, e.g. 2016-03-11', - }, - ], - }, + + // ---------------------------------- // issue:createComment // ---------------------------------- @@ -501,9 +495,9 @@ export class Gitlab implements INodeType { { displayName: 'Due Date', name: 'due_date', - type: 'string', + type: 'dateTime', default: '', - description: 'The Due Date of the issue. Date time string in the format YEAR-MONTH-DAY, e.g. 2016-03-11', + description: 'Due Date for issue.', }, ], }, @@ -860,6 +854,7 @@ export class Gitlab implements INodeType { body.title = this.getNodeParameter('title', i) as string; body.description = this.getNodeParameter('body', i) as string; + body.due_date = this.getNodeParameter('due_date', i) as string; const labels = this.getNodeParameter('labels', i) as IDataObject[]; const assigneeIds = this.getNodeParameter('assignee_ids', i) as IDataObject[]; From c6cf496f64f528edf94e6cb04a07d2a2dfba89ed Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sun, 10 Nov 2019 12:33:23 +0100 Subject: [PATCH 63/66] :zap: Fix status issue on Freshdesk-Node and package.json file --- .../nodes/Freshdesk/Freshdesk.node.ts | 35 ++++++++++--------- packages/nodes-base/package.json | 16 ++++----- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts index 3fb530faa..a6594ec76 100644 --- a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts +++ b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts @@ -16,10 +16,10 @@ import { } from './GenericFunctions'; enum Status { - Open = 1, - Pending = 2, - Resolved = 3, - Closed = 4 + Open = 2, + Pending = 3, + Resolved = 4, + Closed = 5, } enum Priority { @@ -36,7 +36,7 @@ enum Source { Chat = 4, Mobihelp = 5, FeedbackWidget = 6, - OutboundEmail = 7 + OutboundEmail = 7 } interface ICreateTicketBody { @@ -683,7 +683,7 @@ export class Freshdesk implements INodeType { // @ts-ignore source: Source[capitalize(source)] }; - + if (requester === 'requesterId') { // @ts-ignore if (isNaN(value)) { @@ -737,36 +737,39 @@ export class Freshdesk implements INodeType { } if (options.agent) { - options.responder_id = options.agent as number; + body.responder_id = options.agent as number; } if (options.company) { - options.company_id = options.company as number; + body.company_id = options.company as number; } if (options.product) { - options.product_id = options.product as number; + body.product_id = options.product as number; } - + if (options.group) { - options.group_id = options.group as number; + body.group_id = options.group as number; } if (options.frDueBy) { - options.fr_due_by = options.frDueBy as string; + body.fr_due_by = options.frDueBy as string; } if (options.emailConfigId) { - options.email_config_id = options.emailConfigId as number; + body.email_config_id = options.emailConfigId as number; } if (options.dueBy) { - options.due_by = options.dueBy as string; + body.due_by = options.dueBy as string; + } + + if (options.tags) { + body.tags = (options.tags as string).split(',') as [string]; } if (options.ccEmails) { - // @ts-ignore - options.cc_emails = options.ccEmails.split(',') as [string]; + body.cc_emails = (options.ccEmails as string).split(',') as [string]; } try { diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index b8054bba5..034372612 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -33,6 +33,7 @@ "dist/credentials/Aws.credentials.js", "dist/credentials/ChargebeeApi.credentials.js", "dist/credentials/DropboxApi.credentials.js", + "dist/credentials/FreshdeskApi.credentials.js", "dist/credentials/GithubApi.credentials.js", "dist/credentials/GitlabApi.credentials.js", "dist/credentials/GoogleApi.credentials.js", @@ -42,6 +43,7 @@ "dist/credentials/Imap.credentials.js", "dist/credentials/LinkFishApi.credentials.js", "dist/credentials/MailgunApi.credentials.js", + "dist/credentials/MandrillApi.credentials.js", "dist/credentials/MattermostApi.credentials.js", "dist/credentials/MongoDb.credentials.js", "dist/credentials/NextCloudApi.credentials.js", @@ -53,12 +55,10 @@ "dist/credentials/Smtp.credentials.js", "dist/credentials/StripeApi.credentials.js", "dist/credentials/TelegramApi.credentials.js", + "dist/credentials/TodoistApi.credentials.js", "dist/credentials/TrelloApi.credentials.js", "dist/credentials/TwilioApi.credentials.js", - "dist/credentials/TypeformApi.credentials.js", - "dist/credentials/MandrillApi.credentials.js", - "dist/credentials/FreshdeskApi.credentials.js" - "dist/credentials/TodoistApi.credentials.js" + "dist/credentials/TypeformApi.credentials.js" ], "nodes": [ "dist/nodes/ActiveCampaign/ActiveCampaign.node.js", @@ -79,6 +79,7 @@ "dist/nodes/EmailSend.node.js", "dist/nodes/ErrorTrigger.node.js", "dist/nodes/ExecuteCommand.node.js", + "dist/nodes/Freshdesk/Freshdesk.node.js", "dist/nodes/Function.node.js", "dist/nodes/FunctionItem.node.js", "dist/nodes/Github/Github.node.js", @@ -93,6 +94,7 @@ "dist/nodes/Interval.node.js", "dist/nodes/LinkFish/LinkFish.node.js", "dist/nodes/Mailgun/Mailgun.node.js", + "dist/nodes/Mandrill/Mandrill.node.js", "dist/nodes/Mattermost/Mattermost.node.js", "dist/nodes/Merge.node.js", "dist/nodes/MoveBinaryData.node.js", @@ -117,16 +119,14 @@ "dist/nodes/Stripe/StripeTrigger.node.js", "dist/nodes/Telegram/Telegram.node.js", "dist/nodes/Telegram/TelegramTrigger.node.js", + "dist/nodes/Todoist/Todoist.node.js", "dist/nodes/Trello/Trello.node.js", "dist/nodes/Trello/TrelloTrigger.node.js", "dist/nodes/Twilio/Twilio.node.js", "dist/nodes/Typeform/TypeformTrigger.node.js", "dist/nodes/WriteBinaryFile.node.js", "dist/nodes/Webhook.node.js", - "dist/nodes/Xml.node.js", - "dist/nodes/Mandrill/Mandrill.node.js", - "dist/nodes/Freshdesk/Freshdesk.node.js" - "dist/nodes/Todoist/Todoist.node.js" + "dist/nodes/Xml.node.js" ] }, "devDependencies": { From 71aedd7dc9d1d57e511c908feb2ee13f3b30f31f Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Sun, 10 Nov 2019 08:08:56 -0500 Subject: [PATCH 64/66] :bug: fixed source field on Fresdesk node --- .../nodes-base/nodes/Freshdesk/Freshdesk.node.ts | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts index 46eed2b4d..249e0c1c2 100644 --- a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts +++ b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts @@ -16,17 +16,10 @@ import { } from './GenericFunctions'; enum Status { -<<<<<<< HEAD - Open = 1, - Pending = 2, - Resolved = 3, - Closed = 4 -======= Open = 2, Pending = 3, Resolved = 4, Closed = 5, ->>>>>>> 0689f4e403043c5e3f13bc393f1164785772cb19 } enum Priority { @@ -40,10 +33,10 @@ enum Source { Email = 1, Portal = 2, Phone = 3, - Chat = 4, - Mobihelp = 5, - FeedbackWidget = 6, - OutboundEmail = 7 + Chat = 7, + Mobihelp = 8, + FeedbackWidget = 9, + OutboundEmail = 10 } interface ICreateTicketBody { From 3623828283b2bcd81d23347ed04f55005ee7a060 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sun, 10 Nov 2019 22:06:11 +0100 Subject: [PATCH 65/66] :zap: Display helpful error message if n8n-config file is not valid JSON --- packages/core/src/UserSettings.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/core/src/UserSettings.ts b/packages/core/src/UserSettings.ts index dd97b9f40..af32d5e36 100644 --- a/packages/core/src/UserSettings.ts +++ b/packages/core/src/UserSettings.ts @@ -159,9 +159,14 @@ export async function getUserSettings(settingsPath?: string, ignoreCache?: boole } const settingsFile = await fsReadFile(settingsPath, 'utf8'); - settingsCache = JSON.parse(settingsFile); - return JSON.parse(settingsFile) as IUserSettings; + try { + settingsCache = JSON.parse(settingsFile); + } catch (error) { + throw new Error(`Error parsing n8n-config file "${settingsPath}". It does not seem to be valid JSON.`); + } + + return settingsCache as IUserSettings; } From 883d0936cb94ac10801dd9802de4c78345ad5ec4 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Sun, 10 Nov 2019 23:14:36 +0100 Subject: [PATCH 66/66] :shirt: Fix lint issue --- .../nodes/Freshdesk/Freshdesk.node.ts | 18 +++++++++--------- .../nodes/Freshdesk/GenericFunctions.ts | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts index 249e0c1c2..ca64589ba 100644 --- a/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts +++ b/packages/nodes-base/nodes/Freshdesk/Freshdesk.node.ts @@ -39,7 +39,7 @@ enum Source { OutboundEmail = 10 } -interface ICreateTicketBody { +interface ICreateTicketBody { name?: string; requester_id?: number; email?: string; @@ -86,7 +86,7 @@ export class Freshdesk implements INodeType { name: 'freshdeskApi', required: true, } - ], + ], properties: [ { displayName: 'Resource', @@ -565,7 +565,7 @@ export class Freshdesk implements INodeType { // }`, // description: 'Key value pairs containing the names and values of custom fields.', // }, - ] + ] }; methods = { @@ -689,15 +689,15 @@ export class Freshdesk implements INodeType { throw new Error('Requester Id must be a number'); } body.requester_id = parseInt(value, 10); - } else if (requester === 'email'){ + } else if (requester === 'email') { body.email = value; - } else if (requester === 'facebookId'){ + } else if (requester === 'facebookId') { body.facebook_id = value; - } else if (requester === 'phone'){ + } else if (requester === 'phone') { body.phone = value; - } else if (requester === 'twitterId'){ + } else if (requester === 'twitterId') { body.twitter_id = value; - } else if (requester === 'uniqueExternalId'){ + } else if (requester === 'uniqueExternalId') { body.unique_external_id = value; } @@ -782,5 +782,5 @@ export class Freshdesk implements INodeType { return { json: response }; - } + } } diff --git a/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts index ea25ccadc..b1054a211 100644 --- a/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Freshdesk/GenericFunctions.ts @@ -11,14 +11,14 @@ import { import * as _ from 'lodash'; export async function freshdeskApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, resource: string, method: string, body: any = {}, headers?: object): Promise { // tslint:disable-line:no-any - + const credentials = this.getCredentials('freshdeskApi'); if (credentials === undefined) { throw new Error('No credentials got returned!'); } - const apiKey = `${credentials.apiKey}:X`; + const apiKey = `${credentials.apiKey}:X`; const headerWithAuthentication = Object.assign({}, headers, { Authorization: `${Buffer.from(apiKey).toString(BINARY_ENCODING)}` }); @@ -60,7 +60,7 @@ export function validateJSON(json: string | undefined): any { // tslint:disable- return result; } -export function capitalize (s: string) : string { +export function capitalize(s: string): string { if (typeof s !== 'string') return ''; return s.charAt(0).toUpperCase() + s.slice(1); }