UNPKG

n8n-nodes-ocean

Version:

n8n community node for Ocean.io API integration - lookalike company and people discovery

273 lines (272 loc) 11.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Ocean = void 0; const n8n_workflow_1 = require("n8n-workflow"); const GenericFunctions_1 = require("./GenericFunctions"); const CompanyDescription_1 = require("./CompanyDescription"); const PersonDescription_1 = require("./PersonDescription"); const CreditsDescription_1 = require("./CreditsDescription"); class Ocean { description = { displayName: 'Ocean.io', name: 'ocean', icon: 'file:ocean-logo.png', group: ['transform'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Interact with Ocean.io API for lookalike company and people discovery', defaults: { name: 'Ocean.io', }, inputs: [n8n_workflow_1.NodeConnectionType.Main], outputs: [n8n_workflow_1.NodeConnectionType.Main], credentials: [ { name: 'oceanApi', required: true, }, ], requestDefaults: { baseURL: 'https://api.ocean.io', headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, }, properties: [ { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, options: [ { name: 'Company', value: 'company', description: 'Search and enrich company data with lookalike discovery', }, { name: 'Person', value: 'person', description: 'Search and enrich people data with lookalike discovery', }, { name: 'Credits', value: 'credits', description: 'Manage and monitor your Ocean.io API credits', }, ], default: 'company', }, ...CompanyDescription_1.companyOperations, ...PersonDescription_1.personOperations, ...CreditsDescription_1.creditsOperations, ...CompanyDescription_1.companyFields, ...PersonDescription_1.personFields, ...CreditsDescription_1.creditsFields, ], }; async execute() { const items = this.getInputData(); const returnData = []; const length = items.length; const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); for (let i = 0; i < length; i++) { try { let responseData; if (resource === 'company') { responseData = await this.executeCompanyOperation(i); } else if (resource === 'person') { responseData = await this.executePersonOperation(i); } else if (resource === 'credits') { responseData = await this.executeCreditsOperation(i); } else { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `The resource "${resource}" is not known!`, { itemIndex: i, }); } const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } async executeCompanyOperation(itemIndex) { const operation = this.getNodeParameter('operation', itemIndex); if (operation === 'search') { return this.searchCompanies(itemIndex); } else if (operation === 'enrich') { return this.enrichCompany(itemIndex); } else { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `The operation "${operation}" is not known!`, { itemIndex, }); } } async executePersonOperation(itemIndex) { const operation = this.getNodeParameter('operation', itemIndex); if (operation === 'search') { return this.searchPeople(itemIndex); } else if (operation === 'enrich') { return this.enrichPerson(itemIndex); } else { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `The operation "${operation}" is not known!`, { itemIndex, }); } } async executeCreditsOperation(itemIndex) { const operation = this.getNodeParameter('operation', itemIndex); if (operation === 'getBalance') { return this.getCreditBalance(itemIndex); } else { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `The operation "${operation}" is not known!`, { itemIndex, }); } } async searchCompanies(itemIndex) { const returnAll = this.getNodeParameter('returnAll', itemIndex, false); const limit = this.getNodeParameter('limit', itemIndex, 50); // Build search body const body = {}; // Lookalike domains const lookalikeDomains = this.getNodeParameter('lookalikeDomains', itemIndex, ''); if (lookalikeDomains) { body.lookalike_domains = lookalikeDomains.split(',').map(d => d.trim()).filter(d => d); } // Basic filters const companyName = this.getNodeParameter('companyName', itemIndex, ''); if (companyName) { body.company_name = companyName; } const domain = this.getNodeParameter('domain', itemIndex, ''); if (domain) { body.domain = domain; } // Size filters const employeeCountMin = this.getNodeParameter('employeeCountMin', itemIndex, undefined); const employeeCountMax = this.getNodeParameter('employeeCountMax', itemIndex, undefined); if (employeeCountMin !== undefined || employeeCountMax !== undefined) { body.employee_count = {}; if (employeeCountMin !== undefined) body.employee_count.min = employeeCountMin; if (employeeCountMax !== undefined) body.employee_count.max = employeeCountMax; } // Location filters const countries = this.getNodeParameter('countries', itemIndex, ''); if (countries) { body.countries = countries.split(',').map(c => c.trim()).filter(c => c); } // Industry filters const industries = this.getNodeParameter('industries', itemIndex, ''); if (industries) { body.industries = industries.split(',').map(i => i.trim()).filter(i => i); } // Set pagination if (!returnAll) { body.size = limit; } if (returnAll) { return await GenericFunctions_1.oceanApiRequestAllItems.call(this, 'POST', '/v3/search/companies', body); } else { const response = await GenericFunctions_1.oceanApiRequest.call(this, 'POST', '/v3/search/companies', body); return response.companies || []; } } async enrichCompany(itemIndex) { const body = {}; const domain = this.getNodeParameter('domain', itemIndex); if (domain) { body.domain = domain; } const companyName = this.getNodeParameter('companyName', itemIndex, ''); if (companyName) { body.company_name = companyName; } const response = await GenericFunctions_1.oceanApiRequest.call(this, 'POST', '/v2/enrich/company', body); return response; } async searchPeople(itemIndex) { const returnAll = this.getNodeParameter('returnAll', itemIndex, false); const limit = this.getNodeParameter('limit', itemIndex, 50); // Build search body const body = {}; // Lookalike LinkedIn handles const lookalikePeople = this.getNodeParameter('lookalikePeople', itemIndex, ''); if (lookalikePeople) { body.lookalike_people = lookalikePeople.split(',').map(p => p.trim()).filter(p => p); } // Basic filters const personName = this.getNodeParameter('personName', itemIndex, ''); if (personName) { body.person_name = personName; } const jobTitles = this.getNodeParameter('jobTitles', itemIndex, ''); if (jobTitles) { body.job_titles = jobTitles.split(',').map(t => t.trim()).filter(t => t); } // Company filters const companyDomains = this.getNodeParameter('companyDomains', itemIndex, ''); if (companyDomains) { body.company_domains = companyDomains.split(',').map(d => d.trim()).filter(d => d); } // Location filters const countries = this.getNodeParameter('countries', itemIndex, ''); if (countries) { body.countries = countries.split(',').map(c => c.trim()).filter(c => c); } // Set pagination if (!returnAll) { body.size = limit; } if (returnAll) { return await GenericFunctions_1.oceanApiRequestAllItems.call(this, 'POST', '/v3/search/people', body); } else { const response = await GenericFunctions_1.oceanApiRequest.call(this, 'POST', '/v3/search/people', body); return response.people || []; } } async enrichPerson(itemIndex) { const body = {}; const email = this.getNodeParameter('email', itemIndex, ''); if (email) { body.email = email; } const linkedinHandle = this.getNodeParameter('linkedinHandle', itemIndex, ''); if (linkedinHandle) { body.linkedin_handle = linkedinHandle; } const personName = this.getNodeParameter('personName', itemIndex, ''); if (personName) { body.person_name = personName; } const response = await GenericFunctions_1.oceanApiRequest.call(this, 'POST', '/v2/enrich/person', body); return response; } async getCreditBalance(itemIndex) { const response = await GenericFunctions_1.oceanApiRequest.call(this, 'GET', '/v2/credits/balance'); return response; } } exports.Ocean = Ocean;