UNPKG

n8n-nodes-mautic-advanced

Version:

Enhanced n8n node for Mautic with comprehensive API coverage including tags, campaigns, categories, and advanced contact management

917 lines 76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MauticAdvanced = void 0; const change_case_1 = require("change-case"); const n8n_workflow_1 = require("n8n-workflow"); const CampaignContactDescription_1 = require("./CampaignContactDescription"); const CampaignDescription_1 = require("./CampaignDescription"); const CategoryDescription_1 = require("./CategoryDescription"); const CompanyContactDescription_1 = require("./CompanyContactDescription"); const CompanyDescription_1 = require("./CompanyDescription"); const ContactDescription_1 = require("./ContactDescription"); const ContactSegmentDescription_1 = require("./ContactSegmentDescription"); const GenericFunctions_1 = require("./GenericFunctions"); const SegmentEmailDescription_1 = require("./SegmentEmailDescription"); const SegmentDescription_1 = require("./SegmentDescription"); const TagDescription_1 = require("./TagDescription"); class MauticAdvanced { constructor() { this.description = { displayName: 'Mautic Advanced', name: 'mauticAdvanced', icon: 'file:MauticAdvanced.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Consume Mautic API with advanced features', defaults: { name: 'Mautic Advanced', }, usableAsTool: true, inputs: ['main'], outputs: ['main'], credentials: [ { name: 'mauticAdvancedApi', required: true, displayOptions: { show: { authentication: ['credentials'], }, }, }, { name: 'mauticAdvancedOAuth2Api', required: true, displayOptions: { show: { authentication: ['oAuth2'], }, }, }, ], properties: [ { displayName: 'Authentication', name: 'authentication', type: 'options', options: [ { name: 'Credentials', value: 'credentials', }, { name: 'OAuth2', value: 'oAuth2', }, ], default: 'credentials', }, { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, options: [ { name: 'Campaign', value: 'campaign', description: 'Create, update, and retrieve campaigns', }, { name: 'Campaign Contact', value: 'campaignContact', description: 'Add/remove contacts to/from a campaign', }, { name: 'Category', value: 'category', description: 'Create, update, and retrieve categories', }, { name: 'Company', value: 'company', description: 'Create or modify a company', }, { name: 'Company Contact', value: 'companyContact', description: 'Add/remove contacts to/from a company', }, { name: 'Contact', value: 'contact', description: 'Create & modify contacts', }, { name: 'Contact Segment', value: 'contactSegment', description: 'Add/remove contacts to/from a segment', }, { name: 'Segment', value: 'segment', description: 'Create, update, and retrieve segments', }, { name: 'Segment Email', value: 'segmentEmail', description: 'Send an email', }, { name: 'Tag', value: 'tag', description: 'Create, update, and retrieve tags', }, ], default: 'contact', }, ...CompanyDescription_1.companyOperations, ...CompanyDescription_1.companyFields, ...ContactDescription_1.contactOperations, ...ContactDescription_1.contactFields, ...ContactSegmentDescription_1.contactSegmentOperations, ...ContactSegmentDescription_1.contactSegmentFields, ...CampaignDescription_1.campaignOperations, ...CampaignDescription_1.campaignFields, ...CampaignContactDescription_1.campaignContactOperations, ...CampaignContactDescription_1.campaignContactFields, ...CompanyContactDescription_1.companyContactOperations, ...CompanyContactDescription_1.companyContactFields, ...SegmentEmailDescription_1.segmentEmailOperations, ...SegmentEmailDescription_1.segmentEmailFields, ...TagDescription_1.tagOperations, ...TagDescription_1.tagFields, ...CategoryDescription_1.categoryOperations, ...CategoryDescription_1.categoryFields, ...SegmentDescription_1.segmentOperations, ...SegmentDescription_1.segmentFields, ], }; this.methods = { loadOptions: { // Get all the available companies to display them to user so that they can // select them easily async getCompanies() { const returnData = []; const companies = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'companies', 'GET', '/companies'); for (const company of companies) { returnData.push({ name: company.fields.all.companyname, value: company.fields.all.companyname, }); } return returnData; }, // Get all the available tags to display them to user so that they can // select them easily async getTags() { const returnData = []; const tags = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'tags', 'GET', '/tags'); for (const tag of tags) { returnData.push({ name: tag.tag, value: tag.tag, }); } return returnData; }, // Get all the available stages to display them to user so that they can // select them easily async getStages() { const returnData = []; const stages = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'stages', 'GET', '/stages'); for (const stage of stages) { returnData.push({ name: stage.name, value: stage.id, }); } return returnData; }, // Get all the available company fields to display them to user so that they can // select them easily async getCompanyFields() { const returnData = []; const fields = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'fields', 'GET', '/fields/company'); for (const field of fields) { returnData.push({ name: field.label, value: field.alias, }); } return returnData; }, async getIndustries() { const returnData = []; const fields = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'fields', 'GET', '/fields/company'); for (const field of fields) { if (field.alias === 'companyindustry') { for (const { label, value } of field.properties.list) { returnData.push({ name: label, value, }); } } } return returnData; }, // Get all the available contact fields to display them to user so that they can // select them easily async getContactFields() { const returnData = []; // Add key system fields manually (except last_active, which is already present) const systemFields = [ { name: 'Date Added', value: 'date_added' }, { name: 'Date Modified', value: 'date_modified' }, { name: 'ID', value: 'id' }, { name: 'Owner ID', value: 'owner_id' }, ]; returnData.push(...systemFields); // Fetch custom and other fields from Mautic const fields = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'fields', 'GET', '/fields/contact'); for (const field of fields) { returnData.push({ name: field.label, value: field.alias, }); } return returnData; }, // Get all the available segments to display them to user so that they can // select them easily async getSegments() { const returnData = []; const segments = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'segments', 'GET', '/segments'); for (const segment of segments) { returnData.push({ name: segment.name, value: segment.id, }); } return returnData; }, // Get all the available campaings to display them to user so that they can // select them easily async getCampaigns() { const returnData = []; const campaings = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'campaigns', 'GET', '/campaigns'); for (const campaign of campaings) { returnData.push({ name: campaign.name, value: campaign.id, }); } return returnData; }, // Get all the available emails to display them to user so that they can // select them easily async getEmails() { const returnData = []; const emails = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'emails', 'GET', '/emails'); for (const email of emails) { returnData.push({ name: email.name, value: email.id, }); } return returnData; }, // Get all the available list / segment emails to display them to user so that they can // select them easily async getSegmentEmails() { const returnData = []; const emails = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'emails', 'GET', '/emails'); for (const email of emails) { if (email.emailType === 'list') { returnData.push({ name: email.name, value: email.id, }); } } return returnData; }, // Get all the available campaign / template emails to display them to user so that they can // select them easily async getCampaignEmails() { const returnData = []; const emails = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'emails', 'GET', '/emails'); for (const email of emails) { if (email.emailType === 'template') { returnData.push({ name: email.name, value: email.id, }); } } return returnData; }, }, }; } async execute() { const items = this.getInputData(); const returnData = []; const length = items.length; let qs; let responseData; const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); // Handle batch operations that process all items together if (resource === 'contact' && operation === 'deleteBatch') { // Only process once for all items const options = this.getNodeParameter('options', 0, {}); let contactIds = this.getNodeParameter('contactIds', 0, ''); if (!contactIds) { // Fallback: collect from all input items const ids = items .map((item) => item.json.id) .filter((id) => id !== undefined && id !== null && id !== '') .map((id) => String(id)); contactIds = ids.join(','); } if (!contactIds) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'No contact IDs provided or found in input items.'); } try { responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'DELETE', '/contacts/batch/delete', {}, { ids: contactIds }); if (options.rawData === false) { // Return simplified response responseData = { success: true, deletedIds: contactIds.split(','), message: `Successfully deleted ${contactIds.split(',').length} contacts.`, }; } } catch (error) { if (error instanceof n8n_workflow_1.NodeApiError && error.httpCode === '404') { responseData = { success: true, deletedIds: contactIds.split(','), message: 'Some contacts were already deleted or not found.', }; } else { throw error; } } // Return as a single output item return [this.helpers.returnJsonArray([responseData])]; } for (let i = 0; i < length; i++) { qs = {}; try { if (resource === 'campaign') { if (operation === 'create') { const name = this.getNodeParameter('name', i); const additionalFields = this.getNodeParameter('additionalFields', i); const body = { name, ...additionalFields, }; responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'POST', '/campaigns/new', body); responseData = responseData.campaign; } if (operation === 'update') { const campaignId = this.getNodeParameter('campaignId', i); const updateFields = this.getNodeParameter('updateFields', i); const body = { ...updateFields, }; responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'PATCH', `/campaigns/${campaignId}/edit`, body); responseData = responseData.campaign; } if (operation === 'clone') { const campaignId = this.getNodeParameter('campaignId', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'POST', `/campaigns/${campaignId}/clone`); responseData = responseData.campaign; } if (operation === 'get') { const campaignId = this.getNodeParameter('campaignId', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'GET', `/campaigns/${campaignId}`); responseData = responseData.campaign; } if (operation === 'getAll') { const returnAll = this.getNodeParameter('returnAll', i); const options = this.getNodeParameter('options', i); qs = { ...options }; // Patch: enforce default sort order by id ascending if not set by user if (!qs.orderBy) { qs.orderBy = 'id'; } if (!qs.orderByDir) { qs.orderByDir = 'asc'; } if (returnAll) { responseData = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'campaigns', 'GET', '/campaigns', {}, qs); } else { qs.limit = this.getNodeParameter('limit', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'GET', '/campaigns', {}, qs); responseData = responseData.campaigns; } } if (operation === 'getContacts') { const campaignId = this.getNodeParameter('campaignId', i); const returnAll = this.getNodeParameter('returnAll', i); const options = this.getNodeParameter('options', i); qs = { ...options }; if (returnAll) { responseData = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'contacts', 'GET', `/campaigns/${campaignId}/contacts`, {}, qs); } else { qs.limit = this.getNodeParameter('limit', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'GET', `/campaigns/${campaignId}/contacts`, {}, qs); responseData = responseData.contacts; } } if (operation === 'delete') { const campaignId = this.getNodeParameter('campaignId', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'DELETE', `/campaigns/${campaignId}/delete`); responseData = responseData.campaign; } } if (resource === 'segment') { //https://developer.mautic.org/#segments if (operation === 'create') { const name = this.getNodeParameter('name', i); const additionalFields = this.getNodeParameter('additionalFields', i); const body = { name, ...additionalFields, }; responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'POST', '/segments/new', body); responseData = responseData.list; } if (operation === 'update') { const segmentId = this.getNodeParameter('segmentId', i); const createIfNotFound = this.getNodeParameter('createIfNotFound', i); const name = this.getNodeParameter('name', i); const { ...additionalFields } = this.getNodeParameter('additionalFields', i); const body = { name, ...additionalFields, }; const method = createIfNotFound ? 'PUT' : 'PATCH'; responseData = await GenericFunctions_1.mauticApiRequest.call(this, method, `/segments/${segmentId}/edit`, body); responseData = responseData.list; } if (operation === 'get') { const segmentId = this.getNodeParameter('segmentId', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'GET', `/segments/${segmentId}`); responseData = responseData.list; } if (operation === 'getAll') { const returnAll = this.getNodeParameter('returnAll', i); const options = this.getNodeParameter('options', i); qs = { ...options }; if (returnAll) { responseData = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'lists', 'GET', '/segments', {}, qs); } else { const limit = this.getNodeParameter('limit', i); qs.limit = limit; responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'GET', '/segments', {}, qs); responseData = responseData.lists ? Object.values(responseData.lists) : []; } } if (operation === 'delete') { const segmentId = this.getNodeParameter('segmentId', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'DELETE', `/segments/${segmentId}/delete`); responseData = responseData.list; } if (operation === 'addContact') { const segmentId = this.getNodeParameter('segmentId', i); const contactId = this.getNodeParameter('contactId', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'POST', `/segments/${segmentId}/contact/${contactId}/add`); } if (operation === 'removeContact') { const segmentId = this.getNodeParameter('segmentId', i); const contactId = this.getNodeParameter('contactId', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'POST', `/segments/${segmentId}/contact/${contactId}/remove`); } if (operation === 'addContacts') { const segmentId = this.getNodeParameter('segmentId', i); let contactIds = this.getNodeParameter('contactIds', i, ''); if (!contactIds) { // Fallback: collect from all input items const ids = items .map((item) => item.json.contactId || item.json.id) .filter((id) => id !== undefined && id !== null && id !== '') .map((id) => String(id)); contactIds = ids.join(','); } if (!contactIds) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'No contact IDs provided or found in input items.'); } const body = { ids: contactIds.split(','), }; responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'POST', `/segments/${segmentId}/contacts/add`, body); } } if (resource === 'company') { //https://developer.mautic.org/#create-company if (operation === 'create') { const simple = this.getNodeParameter('simple', i); const name = this.getNodeParameter('name', i); const body = { companyname: name, }; const { addressUi, customFieldsUi, companyEmail, fax, industry, numberOfEmpoyees, phone, website, annualRevenue, description, ...rest } = this.getNodeParameter('additionalFields', i); if (addressUi?.addressValues) { const { addressValues } = addressUi; body.companyaddress1 = addressValues.address1; body.companyaddress2 = addressValues.address2; body.companycity = addressValues.city; body.companystate = addressValues.state; body.companycountry = addressValues.country; body.companyzipcode = addressValues.zipCode; } if (companyEmail) { body.companyemail = companyEmail; } if (fax) { body.companyfax = fax; } if (industry) { body.companyindustry = industry; } if (industry) { body.companyindustry = industry; } if (numberOfEmpoyees) { body.companynumber_of_employees = numberOfEmpoyees; } if (phone) { body.companyphone = phone; } if (website) { body.companywebsite = website; } if (annualRevenue) { body.companyannual_revenue = annualRevenue; } if (description) { body.companydescription = description; } if (customFieldsUi?.customFieldValues) { const { customFieldValues } = customFieldsUi; const data = customFieldValues.reduce((obj, value) => Object.assign(obj, { [`${value.fieldId}`]: value.fieldValue }), {}); Object.assign(body, data); } Object.assign(body, rest); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'POST', '/companies/new', body); responseData = responseData.company; if (simple) { responseData = responseData.fields.all; } } //https://developer.mautic.org/#edit-company if (operation === 'update') { const companyId = this.getNodeParameter('companyId', i); const simple = this.getNodeParameter('simple', i); const body = {}; const { addressUi, customFieldsUi, companyEmail, name, fax, industry, numberOfEmpoyees, phone, website, annualRevenue, description, ...rest } = this.getNodeParameter('updateFields', i); if (addressUi?.addressValues) { const { addressValues } = addressUi; body.companyaddress1 = addressValues.address1; body.companyaddress2 = addressValues.address2; body.companycity = addressValues.city; body.companystate = addressValues.state; body.companycountry = addressValues.country; body.companyzipcode = addressValues.zipCode; } if (companyEmail) { body.companyemail = companyEmail; } if (name) { body.companyname = name; } if (fax) { body.companyfax = fax; } if (industry) { body.companyindustry = industry; } if (industry) { body.companyindustry = industry; } if (numberOfEmpoyees) { body.companynumber_of_employees = numberOfEmpoyees; } if (phone) { body.companyphone = phone; } if (website) { body.companywebsite = website; } if (annualRevenue) { body.companyannual_revenue = annualRevenue; } if (description) { body.companydescription = description; } if (customFieldsUi?.customFieldValues) { const { customFieldValues } = customFieldsUi; const data = customFieldValues.reduce((obj, value) => Object.assign(obj, { [`${value.fieldId}`]: value.fieldValue }), {}); Object.assign(body, data); } Object.assign(body, rest); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'PATCH', `/companies/${companyId}/edit`, body); responseData = responseData.company; if (simple) { responseData = responseData.fields.all; } } //https://developer.mautic.org/#get-company if (operation === 'get') { const companyId = this.getNodeParameter('companyId', i); const simple = this.getNodeParameter('simple', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'GET', `/companies/${companyId}`); responseData = responseData.company; if (simple) { responseData = responseData.fields.all; } } //https://developer.mautic.org/#list-contact-companies if (operation === 'getAll') { const returnAll = this.getNodeParameter('returnAll', i); const simple = this.getNodeParameter('simple', i); const additionalFields = this.getNodeParameter('additionalFields', i); qs = Object.assign(qs, additionalFields); // Patch: enforce default sort order by id ascending if not set by user if (!qs.orderBy) { qs.orderBy = 'id'; } if (!qs.orderByDir) { qs.orderByDir = 'asc'; } let limit = undefined; if (!returnAll) { limit = this.getNodeParameter('limit', i); } responseData = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'companies', 'GET', '/companies', {}, qs, limit); if (simple) { responseData = responseData.map((item) => item.fields.all); } } //https://developer.mautic.org/#delete-company if (operation === 'delete') { const simple = this.getNodeParameter('simple', i); const companyId = this.getNodeParameter('companyId', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'DELETE', `/companies/${companyId}/delete`); responseData = responseData.company; if (simple) { responseData = responseData.fields.all; } } } if (resource === 'tag') { if (operation === 'create') { const body = { tag: this.getNodeParameter('tag', i), }; responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'POST', '/tags/new', body); responseData = responseData.tag; } if (operation === 'update') { const tagId = this.getNodeParameter('tagId', i); const createIfNotFound = this.getNodeParameter('createIfNotFound', i); const { tag } = this.getNodeParameter('updateFields', i); const body = {}; if (tag) body.tag = tag; const method = createIfNotFound ? 'PUT' : 'PATCH'; responseData = await GenericFunctions_1.mauticApiRequest.call(this, method, `/tags/${tagId}/edit`, body); responseData = responseData.tag; } if (operation === 'get') { const tagId = this.getNodeParameter('tagId', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'GET', `/tags/${tagId}`); responseData = responseData.tag; } if (operation === 'getAll') { const returnAll = this.getNodeParameter('returnAll', i); const options = this.getNodeParameter('options', i); Object.assign(qs, options); // Patch: enforce default sort order by id ascending if not set by user if (!qs.orderBy) { qs.orderBy = 'id'; } if (!qs.orderByDir) { qs.orderByDir = 'asc'; } let limit = undefined; if (!returnAll) { limit = this.getNodeParameter('limit', i); } responseData = await GenericFunctions_1.mauticApiRequestAllItems.call(this, 'tags', 'GET', '/tags', {}, qs, limit); } if (operation === 'delete') { const tagId = this.getNodeParameter('tagId', i); responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'DELETE', `/tags/${tagId}/delete`); responseData = responseData.tag; } } if (resource === 'contact') { //https://developer.mautic.org/?php#create-contact if (operation === 'create') { const options = this.getNodeParameter('options', i); const additionalFields = this.getNodeParameter('additionalFields', i); const jsonActive = this.getNodeParameter('jsonParameters', i); let body = {}; if (!jsonActive) { body.email = this.getNodeParameter('email', i); body.firstname = this.getNodeParameter('firstName', i); body.lastname = this.getNodeParameter('lastName', i); body.company = this.getNodeParameter('company', i); body.position = this.getNodeParameter('position', i); body.title = this.getNodeParameter('title', i); } else { const json = (0, GenericFunctions_1.validateJSON)(this.getNodeParameter('bodyJson', i)); if (json !== undefined) { body = { ...json }; } else { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Invalid JSON', { itemIndex: i }); } } if (additionalFields.ipAddress) { body.ipAddress = additionalFields.ipAddress; } if (additionalFields.lastActive) { body.lastActive = additionalFields.lastActive; } if (additionalFields.ownerId) { body.owner = additionalFields.ownerId; } if (additionalFields.addressUi) { const addressValues = additionalFields.addressUi .addressValues; if (addressValues) { body.address1 = addressValues.address1; body.address2 = addressValues.address2; body.city = addressValues.city; body.state = addressValues.state; body.country = addressValues.country; body.zipcode = addressValues.zipCode; } } if (additionalFields.socialMediaUi) { const socialMediaValues = additionalFields.socialMediaUi .socialMediaValues; if (socialMediaValues) { body.facebook = socialMediaValues.facebook; body.foursquare = socialMediaValues.foursquare; body.instagram = socialMediaValues.instagram; body.linkedin = socialMediaValues.linkedIn; body.skype = socialMediaValues.skype; body.twitter = socialMediaValues.twitter; } } if (additionalFields.customFieldsUi) { const customFields = additionalFields.customFieldsUi .customFieldValues; if (customFields) { const data = customFields.reduce((obj, value) => Object.assign(obj, { [`${value.fieldId}`]: value.fieldValue }), {}); Object.assign(body, data); } } if (additionalFields.b2bOrb2c) { body.b2b_or_b2c = additionalFields.b2bOrb2c; } if (additionalFields.crmId) { body.crm_id = additionalFields.crmId; } if (additionalFields.fax) { body.fax = additionalFields.fax; } if (additionalFields.hasPurchased) { body.haspurchased = additionalFields.hasPurchased; } if (additionalFields.mobile) { body.mobile = additionalFields.mobile; } if (additionalFields.phone) { body.phone = additionalFields.phone; } if (additionalFields.prospectOrCustomer) { body.prospect_or_customer = additionalFields.prospectOrCustomer; } if (additionalFields.sandbox) { body.sandbox = additionalFields.sandbox; } if (additionalFields.stage) { body.stage = additionalFields.stage; } if (additionalFields.tags) { body.tags = additionalFields.tags; } if (additionalFields.website) { body.website = additionalFields.website; } responseData = await GenericFunctions_1.mauticApiRequest.call(this, 'POST', '/contacts/new', body); responseData = [responseData.contact]; if (options.rawData === false) { responseData = responseData.map((item) => item.fields.all); } } //https://developer.mautic.org/?php#edit-contact if (operation === 'update') { const options = this.getNodeParameter('options', i); const updateFields = this.getNodeParameter('updateFields', i); const contactId = this.getNodeParameter('contactId', i); let body = {}; if (updateFields.email) { body.email = updateFields.email; } if (updateFields.firstName) { body.firstname = updateFields.firstName; } if (updateFields.lastName) { body.lastname = updateFields.lastName; } if (updateFields.company) { body.company = updateFields.company; } if (updateFields.position) { body.position = updateFields.position; } if (updateFields.title) { body.title = updateFields.title; } if (updateFields.bodyJson) { const json = (0, GenericFunctions_1.validateJSON)(updateFields.bodyJson); if (json !== undefined) { body = { ...json }; } else { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Invalid JSON', { itemIndex: i }); } } if (updateFields.ipAddress) { body.ipAddress = updateFields.ipAddress; } if (updateFields.lastActive) { body.lastActive = updateFields.lastActive; } if (updateFields.ownerId) { body.owner = updateFields.ownerId; } if (updateFields.addressUi) { const addressValues = updateFields.addressUi .addressValues; if (addressValues) { body.address1 = addressValues.address1; body.address2 = addressValues.address2; body.city = addressValues.city; body.state = addressValues.state; body.country = addressValues.country; body.zipcode = addressValues.zipCode; } } if (updateFields.socialMediaUi) { const socialMediaValues = updateFields.socialMediaUi .socialMediaValues; if (socialMediaValues) { body.facebook = socialMediaValues.facebook; body.foursquare = socialMediaValues.foursquare; body.instagram = socialMediaValues.instagram; body.linkedin = socialMediaValues.linkedIn; body.skype = socialMediaValues.skype; body.twitter = socialMediaValues.twitter; } } if (updateFields.customFieldsUi) { const customFields = updateFields.customFieldsUi .customFieldValues; if (customFields) { const data = customFields.reduce((obj, value) => Object.assign(obj, { [`${value.fieldId}`]: value.fieldValue }), {}); Object.assign(body, data); } } if (updateFields.b2bOrb2c) { body.b2b_or_b2c = updateFields.b2bOrb2c; } if (updateFields.crmId) { body.crm_id = updateFields.crmId; } if (updateFields.fax) { body.fax = updateFields.fax; } if (updateFields.hasPurchased) { body.haspurchased = updateFields.hasPurchased; } if (updateFields.mobile) { body.mobile = updateFields.mobile; } if (updateFields.phone) { body.phone = updateFields.phone; } if (updateFields.prospectOrCustomer) { body.prospect_or_cu