UNPKG

n8n-nodes-instantly-dev

Version:

n8n community node for Instantly API v2 - DEV TESTING VERSION

269 lines 11.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LeadOperations = void 0; const generic_functions_1 = require("../../generic.functions"); /** * Lead operations handler * Enhanced with comprehensive API coverage and proper endpoints */ class LeadOperations { /** * Create a new lead */ static async create(context, itemIndex) { const email = context.getNodeParameter('email', itemIndex); const firstName = context.getNodeParameter('first_name', itemIndex, ''); const lastName = context.getNodeParameter('last_name', itemIndex, ''); const companyName = context.getNodeParameter('company_name', itemIndex, ''); const additionalFields = context.getNodeParameter('additionalFields', itemIndex, {}); const body = { email, }; // Add basic fields if provided if (firstName) body.first_name = firstName; if (lastName) body.last_name = lastName; if (companyName) body.company_name = companyName; // Add additional fields if (additionalFields.phone) body.phone = additionalFields.phone; if (additionalFields.website) body.website = additionalFields.website; if (additionalFields.personalization) body.personalization = additionalFields.personalization; // Handle campaign resourceLocator if (additionalFields.campaign) { const campaignValue = additionalFields.campaign; if (campaignValue.mode === 'id' && campaignValue.value) { body.campaign = campaignValue.value; } else if (campaignValue.mode === 'list' && campaignValue.value) { body.campaign = campaignValue.value; } } // Handle custom fields - nest under custom_variables according to API spec if (additionalFields.customFields && additionalFields.customFields.customFieldValues && additionalFields.customFields.customFieldValues.field) { const customVariables = {}; // Handle both single field and multiple fields const fields = Array.isArray(additionalFields.customFields.customFieldValues.field) ? additionalFields.customFields.customFieldValues.field : [additionalFields.customFields.customFieldValues.field]; fields.forEach((field) => { if (field.key && field.key.trim() !== '' && field.value !== undefined) { customVariables[field.key.trim()] = field.value; } }); // Add custom_variables to the body if any were provided if (Object.keys(customVariables).length > 0) { body.custom_variables = customVariables; } } return await generic_functions_1.instantlyApiRequest.call(context, 'POST', '/api/v2/leads', body); } /** * Get a single lead by ID */ static async get(context, itemIndex) { const leadLocator = context.getNodeParameter('leadId', itemIndex); let leadId; if (leadLocator.mode === 'id') { leadId = leadLocator.value; } else if (leadLocator.mode === 'list') { leadId = leadLocator.value; } else { throw new Error('Lead ID is required'); } return await generic_functions_1.instantlyApiRequest.call(context, 'GET', `/api/v2/leads/${leadId}`); } /** * Get many leads with filtering and pagination */ static async getMany(context, itemIndex) { const returnAll = context.getNodeParameter('returnAll', itemIndex, false); const filters = context.getNodeParameter('filters', itemIndex, {}); const body = {}; // Add filters if (filters.search) body.search = filters.search; if (filters.filter) body.filter = filters.filter; if (filters.in_campaign !== undefined) body.in_campaign = filters.in_campaign; if (filters.esp_code !== undefined && filters.esp_code !== '') body.esp_code = filters.esp_code; // Handle campaign resourceLocator if (filters.campaign) { const campaignValue = filters.campaign; if (campaignValue.mode === 'id' && campaignValue.value) { body.campaign = campaignValue.value; } else if (campaignValue.mode === 'list' && campaignValue.value) { body.campaign = campaignValue.value; } } if (returnAll) { // Get all results with pagination const allResults = []; let hasMore = true; let startingAfter; while (hasMore) { const requestBody = { ...body }; if (startingAfter) { requestBody.starting_after = startingAfter; } requestBody.limit = 100; // Maximum allowed const response = await generic_functions_1.instantlyApiRequest.call(context, 'POST', '/api/v2/leads/list', requestBody); if (response.items && response.items.length > 0) { allResults.push(...response.items); startingAfter = response.next_starting_after; hasMore = !!startingAfter; } else { hasMore = false; } } return { items: allResults }; } else { // Get limited results const limit = context.getNodeParameter('limit', itemIndex, 50); body.limit = limit; return await generic_functions_1.instantlyApiRequest.call(context, 'POST', '/api/v2/leads/list', body); } } /** * Update a lead */ static async update(context, itemIndex) { const leadLocator = context.getNodeParameter('leadId', itemIndex); const updateFields = context.getNodeParameter('updateFields', itemIndex, {}); let leadId; if (leadLocator.mode === 'id') { leadId = leadLocator.value; } else if (leadLocator.mode === 'list') { leadId = leadLocator.value; } else { throw new Error('Lead ID is required'); } const body = {}; // Add update fields if (updateFields.email) body.email = updateFields.email; if (updateFields.first_name) body.first_name = updateFields.first_name; if (updateFields.last_name) body.last_name = updateFields.last_name; if (updateFields.company_name) body.company_name = updateFields.company_name; if (updateFields.phone) body.phone = updateFields.phone; if (updateFields.website) body.website = updateFields.website; if (updateFields.personalization) body.personalization = updateFields.personalization; if (updateFields.lt_interest_status !== undefined) body.lt_interest_status = updateFields.lt_interest_status; if (updateFields.pl_value_lead) body.pl_value_lead = updateFields.pl_value_lead; // Handle campaign resourceLocator if (updateFields.campaign) { const campaignValue = updateFields.campaign; if (campaignValue.mode === 'id' && campaignValue.value) { body.campaign = campaignValue.value; } else if (campaignValue.mode === 'list' && campaignValue.value) { body.campaign = campaignValue.value; } } return await generic_functions_1.instantlyApiRequest.call(context, 'PATCH', `/api/v2/leads/${leadId}`, body); } /** * Delete a lead */ static async delete(context, itemIndex) { const leadLocator = context.getNodeParameter('leadId', itemIndex); let leadId; if (leadLocator.mode === 'id') { leadId = leadLocator.value; } else if (leadLocator.mode === 'list') { leadId = leadLocator.value; } else { throw new Error('Lead ID is required'); } return await generic_functions_1.instantlyApiRequest.call(context, 'DELETE', `/api/v2/leads/${leadId}`); } /** * Update interest status for leads */ static async updateInterestStatus(context, itemIndex) { const interestStatus = context.getNodeParameter('interestStatus', itemIndex); const leadIds = context.getNodeParameter('leadIds', itemIndex); const body = { interest_status: interestStatus, lead_ids: leadIds.split(',').map(id => id.trim()), }; return await generic_functions_1.instantlyApiRequest.call(context, 'POST', '/api/v2/leads/update-interest-status', body); } /** * Add lead to campaign - streamlined operation for creating a lead and associating with campaign */ static async addToCampaign(context, itemIndex) { // Get campaign ID from resourceLocator const campaignLocator = context.getNodeParameter('campaign', itemIndex); let campaignId; if (typeof campaignLocator === 'string') { // Backward compatibility campaignId = campaignLocator; } else { // ResourceLocator format campaignId = campaignLocator.mode === 'id' ? campaignLocator.value : campaignLocator.value; } // Required core fields const email = context.getNodeParameter('email', itemIndex); const firstName = context.getNodeParameter('firstName', itemIndex); const lastName = context.getNodeParameter('lastName', itemIndex); // Optional fields const personalization = context.getNodeParameter('personalization', itemIndex, ''); const customFields = context.getNodeParameter('customFields', itemIndex, {}); // Build the lead creation payload const body = { email, first_name: firstName, last_name: lastName, campaign: campaignId, // FIXED: Use 'campaign' instead of 'campaign_id' per API spec }; // Add personalization if provided if (personalization && personalization.trim() !== '') { body.personalization = personalization.trim(); } // Process custom fields if provided - FIXED: Nest under custom_variables per API spec if (customFields.customFieldValues && customFields.customFieldValues.field) { const customVariables = {}; // Handle both single field and multiple fields const fields = Array.isArray(customFields.customFieldValues.field) ? customFields.customFieldValues.field : [customFields.customFieldValues.field]; fields.forEach((field) => { if (field.key && field.key.trim() !== '' && field.value !== undefined) { customVariables[field.key.trim()] = field.value; } }); // Add custom_variables to the body if any were provided if (Object.keys(customVariables).length > 0) { body.custom_variables = customVariables; } } return await generic_functions_1.instantlyApiRequest.call(context, 'POST', '/api/v2/leads', body); } } exports.LeadOperations = LeadOperations; //# sourceMappingURL=LeadOperations.js.map