2020-01-26 20:27:14 -08:00
import {
IExecuteFunctions ,
} from 'n8n-core' ;
2021-03-23 16:20:48 -07:00
2020-01-26 20:27:14 -08:00
import {
IDataObject ,
INodeExecutionData ,
INodeType ,
INodeTypeDescription ,
} from 'n8n-workflow' ;
2021-03-23 16:20:48 -07:00
2020-01-26 20:27:14 -08:00
import {
clearbitApiRequest ,
} from './GenericFunctions' ;
2021-03-23 16:20:48 -07:00
2020-01-26 20:27:14 -08:00
import {
companyFields ,
companyOperations ,
} from './CompanyDescription' ;
2021-03-23 16:20:48 -07:00
2020-01-26 20:27:14 -08:00
import {
2020-01-29 21:49:04 -08:00
personFields ,
2020-10-01 05:01:39 -07:00
personOperations ,
2020-01-26 20:27:14 -08:00
} from './PersonDescription' ;
export class Clearbit implements INodeType {
description : INodeTypeDescription = {
displayName : 'Clearbit' ,
name : 'clearbit' ,
2021-03-23 16:20:48 -07:00
icon : 'file:clearbit.svg' ,
2020-01-26 20:27:14 -08:00
group : [ 'output' ] ,
version : 1 ,
subtitle : '={{$parameter["operation"] + ":" + $parameter["resource"]}}' ,
description : 'Consume Clearbit API' ,
defaults : {
name : 'Clearbit' ,
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'clearbitApi' ,
required : true ,
2020-10-22 06:46:03 -07:00
} ,
2020-01-26 20:27:14 -08:00
] ,
properties : [
{
displayName : 'Resource' ,
name : 'resource' ,
type : 'options' ,
options : [
{
name : 'Company' ,
value : 'company' ,
description : 'The Company API allows you to look up a company by their domain' ,
} ,
{
name : 'Person' ,
value : 'person' ,
2022-05-06 14:01:25 -07:00
description : 'The Person API lets you retrieve social information associated with an email address, such as a person’ s name, location and Twitter handle' ,
2020-01-26 20:27:14 -08:00
} ,
] ,
default : 'company' ,
description : 'Resource to consume.' ,
} ,
. . . companyOperations ,
. . . companyFields ,
. . . personOperations ,
. . . personFields ,
] ,
} ;
async execute ( this : IExecuteFunctions ) : Promise < INodeExecutionData [ ] [ ] > {
const items = this . getInputData ( ) ;
const returnData : IDataObject [ ] = [ ] ;
2022-04-22 09:29:51 -07:00
const length = items . length ;
2020-01-26 20:27:14 -08:00
const qs : IDataObject = { } ;
let responseData ;
const resource = this . getNodeParameter ( 'resource' , 0 ) as string ;
const operation = this . getNodeParameter ( 'operation' , 0 ) as string ;
for ( let i = 0 ; i < length ; i ++ ) {
2021-07-19 23:58:54 -07:00
try {
if ( resource === 'person' ) {
if ( operation === 'enrich' ) {
const email = this . getNodeParameter ( 'email' , i ) as string ;
const additionalFields = this . getNodeParameter ( 'additionalFields' , i ) as IDataObject ;
qs . email = email ;
if ( additionalFields . givenName ) {
qs . given_name = additionalFields . givenName as string ;
}
if ( additionalFields . familyName ) {
qs . family_name = additionalFields . familyName as string ;
}
if ( additionalFields . ipAddress ) {
qs . ip_address = additionalFields . ipAddress as string ;
}
if ( additionalFields . location ) {
qs . location = additionalFields . location as string ;
}
if ( additionalFields . company ) {
qs . company = additionalFields . company as string ;
}
if ( additionalFields . companyDomain ) {
qs . company_domain = additionalFields . companyDomain as string ;
}
if ( additionalFields . linkedIn ) {
qs . linkedin = additionalFields . linkedIn as string ;
}
if ( additionalFields . twitter ) {
qs . twitter = additionalFields . twitter as string ;
}
if ( additionalFields . facebook ) {
qs . facebook = additionalFields . facebook as string ;
}
responseData = await clearbitApiRequest . call ( this , 'GET' , ` ${ resource } -stream ` , '/v2/people/find' , { } , qs ) ;
2020-01-26 20:27:14 -08:00
}
}
2021-07-19 23:58:54 -07:00
if ( resource === 'company' ) {
if ( operation === 'enrich' ) {
const domain = this . getNodeParameter ( 'domain' , i ) as string ;
const additionalFields = this . getNodeParameter ( 'additionalFields' , i ) as IDataObject ;
qs . domain = domain ;
if ( additionalFields . companyName ) {
qs . company_name = additionalFields . companyName as string ;
}
if ( additionalFields . linkedin ) {
qs . linkedin = additionalFields . linkedin as string ;
}
if ( additionalFields . twitter ) {
qs . twitter = additionalFields . twitter as string ;
}
if ( additionalFields . facebook ) {
qs . facebook = additionalFields . facebook as string ;
}
responseData = await clearbitApiRequest . call ( this , 'GET' , ` ${ resource } -stream ` , '/v2/companies/find' , { } , qs ) ;
2020-01-26 20:27:14 -08:00
}
2021-07-19 23:58:54 -07:00
if ( operation === 'autocomplete' ) {
const name = this . getNodeParameter ( 'name' , i ) as string ;
qs . query = name ;
responseData = await clearbitApiRequest . call ( this , 'GET' , 'autocomplete' , '/v1/companies/suggest' , { } , qs ) ;
2020-01-26 20:27:14 -08:00
}
}
2021-07-19 23:58:54 -07:00
if ( Array . isArray ( responseData ) ) {
returnData . push . apply ( returnData , responseData as IDataObject [ ] ) ;
} else {
returnData . push ( responseData as IDataObject ) ;
2020-01-26 20:27:14 -08:00
}
2021-07-19 23:58:54 -07:00
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
returnData . push ( { error : error.message } ) ;
continue ;
}
throw error ;
2020-01-26 20:27:14 -08:00
}
}
return [ this . helpers . returnJsonArray ( returnData ) ] ;
}
}