From 0da9c035874f0d1a160cec50cf4a3e0890b3dda5 Mon Sep 17 00:00:00 2001 From: quansenB Date: Sun, 3 Nov 2019 16:42:18 +0100 Subject: [PATCH] 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 127d06c459..ae163d7482 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 0000000000..4399ca3fa0 --- /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[]