2023-01-27 03:22:44 -08:00
import type {
2023-03-09 09:13:15 -08:00
IHookFunctions ,
IWebhookFunctions ,
2021-03-04 01:25:47 -08:00
IDataObject ,
ILoadOptionsFunctions ,
INodeType ,
INodeTypeDescription ,
IWebhookResponseData ,
} from 'n8n-workflow' ;
2024-08-29 06:55:53 -07:00
import { NodeConnectionType } from 'n8n-workflow' ;
2021-03-04 01:25:47 -08:00
2022-08-17 08:50:24 -07:00
import { getEvents , lemlistApiRequest } from './GenericFunctions' ;
2021-03-04 01:25:47 -08:00
export class LemlistTrigger implements INodeType {
description : INodeTypeDescription = {
displayName : 'Lemlist Trigger' ,
name : 'lemlistTrigger' ,
icon : 'file:lemlist.svg' ,
group : [ 'trigger' ] ,
version : 1 ,
subtitle : '={{$parameter["event"]}}' ,
description : 'Handle Lemlist events via webhooks' ,
defaults : {
name : 'Lemlist Trigger' ,
} ,
inputs : [ ] ,
2024-08-29 06:55:53 -07:00
outputs : [ NodeConnectionType . Main ] ,
2021-03-04 01:25:47 -08:00
credentials : [
{
name : 'lemlistApi' ,
required : true ,
} ,
] ,
webhooks : [
{
name : 'default' ,
httpMethod : 'POST' ,
responseMode : 'onReceived' ,
path : 'webhook' ,
} ,
] ,
properties : [
{
displayName : 'Event' ,
name : 'event' ,
type : 'options' ,
required : true ,
default : '' ,
2022-08-17 08:50:24 -07:00
options : [ . . . getEvents ( ) ] ,
2021-03-04 01:25:47 -08:00
} ,
{
displayName : 'Options' ,
name : 'options' ,
type : 'collection' ,
placeholder : 'Add Field' ,
default : { } ,
options : [
{
2024-08-07 02:17:29 -07:00
displayName : 'Campaign Name or ID' ,
2021-03-04 01:25:47 -08:00
name : 'campaignId' ,
type : 'options' ,
typeOptions : {
loadOptionsMethod : 'getCampaigns' ,
} ,
default : '' ,
2022-08-17 08:50:24 -07:00
description :
2024-09-12 07:53:36 -07:00
'We\'ll call this hook only for this campaignId. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.' ,
2021-03-04 01:25:47 -08:00
} ,
{
displayName : 'Is First' ,
name : 'isFirst' ,
type : 'boolean' ,
default : false ,
2022-06-20 07:54:01 -07:00
description : 'Whether to call this hook only the first time this activity happened' ,
2021-03-04 01:25:47 -08:00
} ,
] ,
} ,
] ,
} ;
methods = {
loadOptions : {
async getCampaigns ( this : ILoadOptionsFunctions ) {
const campaigns = await lemlistApiRequest . call ( this , 'GET' , '/campaigns' ) ;
2022-08-17 08:50:24 -07:00
return campaigns . map ( ( { _id , name } : { _id : string ; name : string } ) = > ( {
2021-03-04 01:25:47 -08:00
name ,
value : _id ,
} ) ) ;
} ,
} ,
} ;
2022-12-02 12:54:28 -08:00
2021-03-04 01:25:47 -08:00
webhookMethods = {
default : {
async checkExists ( this : IHookFunctions ) : Promise < boolean > {
const webhookData = this . getWorkflowStaticData ( 'node' ) ;
const webhookUrl = this . getNodeWebhookUrl ( 'default' ) ;
const webhooks = await lemlistApiRequest . call ( this , 'GET' , '/hooks' ) ;
for ( const webhook of webhooks ) {
if ( webhook . targetUrl === webhookUrl ) {
await lemlistApiRequest . call ( this , 'DELETE' , ` /hooks/ ${ webhookData . webhookId } ` ) ;
return false ;
}
}
return false ;
} ,
async create ( this : IHookFunctions ) : Promise < boolean > {
const webhookUrl = this . getNodeWebhookUrl ( 'default' ) ;
const webhookData = this . getWorkflowStaticData ( 'node' ) ;
const options = this . getNodeParameter ( 'options' ) as IDataObject ;
const event = this . getNodeParameter ( 'event' ) as string [ ] ;
const body : IDataObject = {
targetUrl : webhookUrl ,
2021-09-15 01:28:48 -07:00
type : event ,
2021-03-04 01:25:47 -08:00
} ;
2021-09-15 01:28:48 -07:00
if ( event . includes ( '*' ) ) {
delete body . type ;
}
2021-03-04 01:25:47 -08:00
Object . assign ( body , options ) ;
const webhook = await lemlistApiRequest . call ( this , 'POST' , '/hooks' , body ) ;
webhookData . webhookId = webhook . _id ;
return true ;
} ,
async delete ( this : IHookFunctions ) : Promise < boolean > {
const webhookData = this . getWorkflowStaticData ( 'node' ) ;
try {
await lemlistApiRequest . call ( this , 'DELETE' , ` /hooks/ ${ webhookData . webhookId } ` ) ;
} catch ( error ) {
return false ;
}
delete webhookData . webhookId ;
return true ;
} ,
} ,
} ;
async webhook ( this : IWebhookFunctions ) : Promise < IWebhookResponseData > {
const req = this . getRequestObject ( ) ;
return {
2023-02-27 19:39:43 -08:00
workflowData : [ this . helpers . returnJsonArray ( req . body as IDataObject ) ] ,
2021-03-04 01:25:47 -08:00
} ;
}
}