UNPKG

n8n-nodes-instantly-dev

Version:

n8n community node for Instantly API v2

348 lines 16.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CampaignOperations = void 0; const n8n_workflow_1 = require("n8n-workflow"); const generic_functions_1 = require("../../generic.functions"); const paginationHelpers_1 = require("../functions/paginationHelpers"); const resourceLocatorHelpers_1 = require("../functions/resourceLocatorHelpers"); /** * Campaign operations handler */ class CampaignOperations { /** * Create a new campaign */ static async create(context, itemIndex) { // Required fields const name = context.getNodeParameter('name', itemIndex); const scheduleName = context.getNodeParameter('scheduleName', itemIndex); const scheduleStartTime = context.getNodeParameter('scheduleStartTime', itemIndex); const scheduleEndTime = context.getNodeParameter('scheduleEndTime', itemIndex); const scheduleDays = context.getNodeParameter('scheduleDays', itemIndex); const scheduleTimezone = context.getNodeParameter('scheduleTimezone', itemIndex); // Additional fields const additionalFields = context.getNodeParameter('additionalFields', itemIndex, {}); // Build the days object from the selected days array const days = {}; scheduleDays.forEach(day => { const dayKey = day; days[dayKey] = true; }); // Build the schedule object const scheduleItem = { name: scheduleName, timing: { from: scheduleStartTime, to: scheduleEndTime, }, days, timezone: scheduleTimezone, }; const campaignSchedule = { schedules: [scheduleItem], }; // Add optional start/end dates if provided if (additionalFields.startDate) { campaignSchedule.start_date = additionalFields.startDate; } if (additionalFields.endDate) { campaignSchedule.end_date = additionalFields.endDate; } // Build the campaign creation payload const campaignData = { name, campaign_schedule: campaignSchedule, }; // Add optional fields if provided if (additionalFields.plValue !== undefined) { campaignData.pl_value = additionalFields.plValue; } if (additionalFields.isEvergreen !== undefined) { campaignData.is_evergreen = additionalFields.isEvergreen; } if (additionalFields.emailGap !== undefined) { campaignData.email_gap = additionalFields.emailGap; } if (additionalFields.randomWaitMax !== undefined) { campaignData.random_wait_max = additionalFields.randomWaitMax; } if (additionalFields.textOnly !== undefined) { campaignData.text_only = additionalFields.textOnly; } if (additionalFields.dailyLimit !== undefined) { campaignData.daily_limit = additionalFields.dailyLimit; } if (additionalFields.dailyMaxLeads !== undefined) { campaignData.daily_max_leads = additionalFields.dailyMaxLeads; } if (additionalFields.linkTracking !== undefined) { campaignData.link_tracking = additionalFields.linkTracking; } if (additionalFields.openTracking !== undefined) { campaignData.open_tracking = additionalFields.openTracking; } if (additionalFields.stopOnReply !== undefined) { campaignData.stop_on_reply = additionalFields.stopOnReply; } if (additionalFields.stopOnAutoReply !== undefined) { campaignData.stop_on_auto_reply = additionalFields.stopOnAutoReply; } if (additionalFields.stopForCompany !== undefined) { campaignData.stop_for_company = additionalFields.stopForCompany; } if (additionalFields.prioritizeNewLeads !== undefined) { campaignData.prioritize_new_leads = additionalFields.prioritizeNewLeads; } if (additionalFields.matchLeadEsp !== undefined) { campaignData.match_lead_esp = additionalFields.matchLeadEsp; } if (additionalFields.insertUnsubscribeHeader !== undefined) { campaignData.insert_unsubscribe_header = additionalFields.insertUnsubscribeHeader; } if (additionalFields.allowRiskyContacts !== undefined) { campaignData.allow_risky_contacts = additionalFields.allowRiskyContacts; } if (additionalFields.disableBounceProtect !== undefined) { campaignData.disable_bounce_protect = additionalFields.disableBounceProtect; } // Handle array fields if (additionalFields.emailList && additionalFields.emailList.length > 0) { campaignData.email_list = additionalFields.emailList; } if (additionalFields.emailTagList && additionalFields.emailTagList.length > 0) { campaignData.email_tag_list = additionalFields.emailTagList; } if (additionalFields.ccList && additionalFields.ccList.length > 0) { campaignData.cc_list = additionalFields.ccList; } if (additionalFields.bccList && additionalFields.bccList.length > 0) { campaignData.bcc_list = additionalFields.bccList; } // Handle auto variant select if (additionalFields.autoVariantSelectTrigger) { campaignData.auto_variant_select = { trigger: additionalFields.autoVariantSelectTrigger, }; } // Handle email sequence steps if (additionalFields.sequenceSteps && additionalFields.sequenceSteps.steps && additionalFields.sequenceSteps.steps.step) { const sequenceSteps = Array.isArray(additionalFields.sequenceSteps.steps.step) ? additionalFields.sequenceSteps.steps.step : [additionalFields.sequenceSteps.steps.step]; // Validate and build steps array for the sequence const steps = []; sequenceSteps.forEach((step, index) => { const stepNumber = index + 1; // Validate required fields if (!step.subject || !step.body) { throw new n8n_workflow_1.NodeOperationError(context.getNode(), `Email step ${stepNumber} is missing required subject or body`, { itemIndex }); } // Helper function to preserve Instantly variables and handle line breaks const processEmailContent = (content) => { if (!content) return ''; // Convert line breaks to \n for JSON payload // This ensures proper formatting in Instantly emails return content.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); }; // Build sequence step object const sequenceStep = { subject: processEmailContent(step.subject), body: processEmailContent(step.body), }; // Add delay for steps after the first one if (stepNumber > 1) { if (!step.delay || step.delay < 1) { throw new n8n_workflow_1.NodeOperationError(context.getNode(), `Email step ${stepNumber} requires a delay of at least 1 day`, { itemIndex }); } sequenceStep.delay = step.delay; } steps.push(sequenceStep); }); // Add sequences to campaign data if any were provided // The API expects an array with a single sequence object containing steps if (steps.length > 0) { campaignData.sequences = [{ steps: steps }]; } } return await generic_functions_1.instantlyApiRequest.call(context, 'POST', '/api/v2/campaigns', campaignData); } /** * Get a single campaign by ID */ static async get(context, itemIndex) { const campaignId = (0, resourceLocatorHelpers_1.getCampaignId)(context, itemIndex); return await generic_functions_1.instantlyApiRequest.call(context, 'GET', `/api/v2/campaigns/${campaignId}`); } /** * Get many campaigns with pagination support */ static async getMany(context, itemIndex) { const returnAll = context.getNodeParameter('returnAll', itemIndex, false); const limit = context.getNodeParameter('limit', itemIndex, 50); // Validate limit doesn't exceed 100 if (limit > 100) { throw new n8n_workflow_1.NodeOperationError(context.getNode(), 'Limit cannot exceed 100. Instantly API has a maximum limit of 100.', { itemIndex }); } if (returnAll) { // Get all campaigns with pagination const allCampaigns = await (0, paginationHelpers_1.paginateInstantlyApi)(context, '/api/v2/campaigns', 'campaigns'); return { items: allCampaigns }; } else { // Get single page with specified limit const queryParams = { limit }; return await generic_functions_1.instantlyApiRequest.call(context, 'GET', '/api/v2/campaigns', {}, queryParams); } } /** * Update a campaign */ static async update(context, itemIndex) { const campaignId = (0, resourceLocatorHelpers_1.getCampaignId)(context, itemIndex); const name = context.getNodeParameter('name', itemIndex, ''); const updateAdditionalFields = context.getNodeParameter('updateAdditionalFields', itemIndex, {}); const campaignSchedule = context.getNodeParameter('campaignSchedule', itemIndex, {}); // Build the request body const body = {}; // Only add name if it's provided if (name && name.trim() !== '') { body.name = name.trim(); } // Add additional fields if provided if (updateAdditionalFields.plValue !== undefined) { body.pl_value = updateAdditionalFields.plValue; } if (updateAdditionalFields.isEvergreen !== undefined) { body.is_evergreen = updateAdditionalFields.isEvergreen; } if (updateAdditionalFields.emailGap !== undefined) { body.email_gap = updateAdditionalFields.emailGap; } if (updateAdditionalFields.randomWaitMax !== undefined) { body.random_wait_max = updateAdditionalFields.randomWaitMax; } if (updateAdditionalFields.textOnly !== undefined) { body.text_only = updateAdditionalFields.textOnly; } if (updateAdditionalFields.dailyLimit !== undefined) { body.daily_limit = updateAdditionalFields.dailyLimit; } if (updateAdditionalFields.dailyMaxLeads !== undefined) { body.daily_max_leads = updateAdditionalFields.dailyMaxLeads; } if (updateAdditionalFields.emailList !== undefined && updateAdditionalFields.emailList.length > 0) { body.email_list = updateAdditionalFields.emailList; } if (updateAdditionalFields.emailTagList !== undefined && updateAdditionalFields.emailTagList.trim() !== '') { body.email_tag_list = updateAdditionalFields.emailTagList.split(',').map((tag) => tag.trim()); } if (updateAdditionalFields.ccList !== undefined && updateAdditionalFields.ccList.trim() !== '') { body.cc_list = updateAdditionalFields.ccList.split(',').map((email) => email.trim()); } if (updateAdditionalFields.bccList !== undefined && updateAdditionalFields.bccList.trim() !== '') { body.bcc_list = updateAdditionalFields.bccList.split(',').map((email) => email.trim()); } if (updateAdditionalFields.linkTracking !== undefined) { body.link_tracking = updateAdditionalFields.linkTracking; } if (updateAdditionalFields.openTracking !== undefined) { body.open_tracking = updateAdditionalFields.openTracking; } if (updateAdditionalFields.stopOnReply !== undefined) { body.stop_on_reply = updateAdditionalFields.stopOnReply; } if (updateAdditionalFields.stopOnAutoReply !== undefined) { body.stop_on_auto_reply = updateAdditionalFields.stopOnAutoReply; } if (updateAdditionalFields.stopForCompany !== undefined) { body.stop_for_company = updateAdditionalFields.stopForCompany; } if (updateAdditionalFields.prioritizeNewLeads !== undefined) { body.prioritize_new_leads = updateAdditionalFields.prioritizeNewLeads; } if (updateAdditionalFields.matchLeadEsp !== undefined) { body.match_lead_esp = updateAdditionalFields.matchLeadEsp; } if (updateAdditionalFields.insertUnsubscribeHeader !== undefined) { body.insert_unsubscribe_header = updateAdditionalFields.insertUnsubscribeHeader; } if (updateAdditionalFields.allowRiskyContacts !== undefined) { body.allow_risky_contacts = updateAdditionalFields.allowRiskyContacts; } if (updateAdditionalFields.disableBounceProtect !== undefined) { body.disable_bounce_protect = updateAdditionalFields.disableBounceProtect; } if (updateAdditionalFields.autoVariantSelectTrigger !== undefined && updateAdditionalFields.autoVariantSelectTrigger !== '') { body.auto_variant_select = { trigger: updateAdditionalFields.autoVariantSelectTrigger, }; } if (updateAdditionalFields.sequences !== undefined && updateAdditionalFields.sequences.trim() !== '') { try { body.sequences = JSON.parse(updateAdditionalFields.sequences); } catch (error) { throw new Error('Invalid JSON format for sequences field'); } } // Handle campaign schedule if (campaignSchedule && Object.keys(campaignSchedule).length > 0) { const schedule = {}; if (campaignSchedule.startDate) { schedule.start_date = campaignSchedule.startDate; } if (campaignSchedule.endDate) { schedule.end_date = campaignSchedule.endDate; } if (campaignSchedule.schedules && campaignSchedule.schedules.schedule && campaignSchedule.schedules.schedule.length > 0) { schedule.schedules = campaignSchedule.schedules.schedule.map((sched) => { const scheduleItem = { name: sched.name || 'Default Schedule', timing: { from: sched.from || '09:00', to: sched.to || '17:00', }, timezone: sched.timezone || 'America/New_York', }; // Convert days array to object format expected by API if (sched.days && Array.isArray(sched.days)) { const daysObj = {}; for (let i = 0; i <= 6; i++) { daysObj[i.toString()] = sched.days.includes(i.toString()); } scheduleItem.days = daysObj; } else { // Default to weekdays scheduleItem.days = { '0': false, // Sunday '1': true, // Monday '2': true, // Tuesday '3': true, // Wednesday '4': true, // Thursday '5': true, // Friday '6': false, // Saturday }; } return scheduleItem; }); } if (Object.keys(schedule).length > 0) { body.campaign_schedule = schedule; } } return await generic_functions_1.instantlyApiRequest.call(context, 'PATCH', `/api/v2/campaigns/${campaignId}`, body); } /** * Delete a campaign */ static async delete(context, itemIndex) { const campaignId = (0, resourceLocatorHelpers_1.getCampaignId)(context, itemIndex); return await generic_functions_1.instantlyApiRequest.call(context, 'DELETE', `/api/v2/campaigns/${campaignId}`); } } exports.CampaignOperations = CampaignOperations; //# sourceMappingURL=CampaignOperations.backup.v0.1.7512.js.map