From 3cfcbead719c42a13d737acf2d22a0ce60830aa8 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Sat, 16 Nov 2019 18:47:28 -0500 Subject: [PATCH] :sparkles: Intercom node --- .../nodes/Intercom/GenericFunctions.ts | 13 +++- .../nodes/Intercom/Intercom.node.ts | 69 ++++++++++++++++++- .../nodes/Intercom/LeadDescription.ts | 26 ++++++- .../nodes/Intercom/LeadInterface.ts | 16 +++++ 4 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 packages/nodes-base/nodes/Intercom/LeadInterface.ts diff --git a/packages/nodes-base/nodes/Intercom/GenericFunctions.ts b/packages/nodes-base/nodes/Intercom/GenericFunctions.ts index 007aa700cb..8b32b726be 100644 --- a/packages/nodes-base/nodes/Intercom/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Intercom/GenericFunctions.ts @@ -27,9 +27,6 @@ export async function intercomApiRequest(this: IHookFunctions | IExecuteFunction json: true }; - console.log(options) - - try { return await this.helpers.request!(options); } catch (error) { @@ -43,3 +40,13 @@ export async function intercomApiRequest(this: IHookFunctions | IExecuteFunction 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; +} diff --git a/packages/nodes-base/nodes/Intercom/Intercom.node.ts b/packages/nodes-base/nodes/Intercom/Intercom.node.ts index e746715fbb..8f4c63a926 100644 --- a/packages/nodes-base/nodes/Intercom/Intercom.node.ts +++ b/packages/nodes-base/nodes/Intercom/Intercom.node.ts @@ -15,7 +15,12 @@ import { } from './LeadDescription'; import { intercomApiRequest, + validateJSON, } from './GenericFunctions'; +import { + ILead, + ILeadCompany + } from './LeadInterface'; export class Intercom implements INodeType { @@ -74,7 +79,7 @@ export class Intercom implements INodeType { companies = response.companies; for (const company of companies) { const companyName = company.name; - const companyId = company.id; + const companyId = company.company_id; returnData.push({ name: companyName, value: companyId, @@ -86,9 +91,67 @@ export class Intercom 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 === 'lead') { + if (opeation === 'create') { + const email = this.getNodeParameter('email') as string; + const options = this.getNodeParameter('options') as IDataObject; + const jsonActive = this.getNodeParameter('jsonParameters') as boolean; + const body: ILead = { + email, + }; + if (options.phone) { + body.phone = options.phone as string; + } + if (options.name) { + body.name = options.name as string; + } + if (options.name) { + body.name = options.name as string; + } + if (options.unsubscribedFromEmails) { + body.unsubscribed_from_emails = options.unsubscribedFromEmails as boolean; + } + if (options.updateLastRequestAt) { + body.update_last_request_at = options.updateLastRequestAt as boolean; + } + if (options.companies) { + const companies: ILeadCompany[] = []; + // @ts-ignore + options.companies.forEach( o => { + const company: ILeadCompany = {}; + company.company_id = o; + companies.push(company); + }); + body.companies = companies; + } + if (!jsonActive) { + const customAttributesValues = (this.getNodeParameter('customAttributesUi') as IDataObject).customAttributesValues as IDataObject[]; + if (customAttributesValues) { + const customAttributes = {}; + for (let i = 0; i < customAttributesValues.length; i++) { + // @ts-ignore + customAttributes[customAttributesValues[i].name] = customAttributesValues[i].value; + } + body.custom_attributes = customAttributes; + } + } else { + const customAttributesJson = validateJSON(this.getNodeParameter('customAttributesJson') as string); + if (customAttributesJson) { + body.custom_attributes = customAttributesJson; + } + } + try { + response = await intercomApiRequest.call(this, '/contacts', 'POST', body); + } catch (err) { + throw new Error(`Intercom Error: ${JSON.stringify(err)}`); + } + } + } return { - json: {}, + json: response, }; } } diff --git a/packages/nodes-base/nodes/Intercom/LeadDescription.ts b/packages/nodes-base/nodes/Intercom/LeadDescription.ts index ef4e8ea3ff..44dc94b594 100644 --- a/packages/nodes-base/nodes/Intercom/LeadDescription.ts +++ b/packages/nodes-base/nodes/Intercom/LeadDescription.ts @@ -125,7 +125,31 @@ export const leadFields = [ }, { displayName: 'Custom Attributes', - name: 'customAttributes', + name: 'customAttributesJson', + type: 'json', + required: false, + typeOptions: { + alwaysOpenEditWindow: true, + }, + displayOptions: { + show: { + resource: [ + 'lead', + ], + operation: [ + 'create', + ], + jsonParameters: [ + true, + ], + }, + }, + default: '', + description: 'A hash of key/value pairs to represent custom data you want to attribute to a user.', + }, + { + displayName: 'Custom Attributes', + name: 'customAttributesUi', type: 'fixedCollection', default: '', placeholder: 'Add Attribute', diff --git a/packages/nodes-base/nodes/Intercom/LeadInterface.ts b/packages/nodes-base/nodes/Intercom/LeadInterface.ts new file mode 100644 index 0000000000..480407bafb --- /dev/null +++ b/packages/nodes-base/nodes/Intercom/LeadInterface.ts @@ -0,0 +1,16 @@ +import { IDataObject } from "n8n-workflow"; + +export interface ILeadCompany { + company_id?: string; +} + +export interface ILead { + email: string; + phone?: string; + name?: string; + custom_attributes?: IDataObject; + companies?: ILeadCompany[]; + last_request_at?: number; + unsubscribed_from_emails?: boolean; + update_last_request_at?: boolean; +}