2021-02-07 14:32:12 -08:00
import {
IHookFunctions ,
IWebhookFunctions ,
} from 'n8n-core' ;
import {
IDataObject ,
ILoadOptionsFunctions ,
INodePropertyOptions ,
INodeType ,
INodeTypeDescription ,
IWebhookResponseData ,
2021-04-16 09:33:36 -07:00
NodeApiError ,
NodeOperationError ,
2021-02-07 14:32:12 -08:00
} from 'n8n-workflow' ;
import {
getresponseApiRequest ,
getResponseApiRequestAllItems ,
} from './GenericFunctions' ;
export class GetResponseTrigger implements INodeType {
description : INodeTypeDescription = {
displayName : 'GetResponse Trigger' ,
name : 'getResponseTrigger' ,
icon : 'file:getResponse.png' ,
group : [ 'trigger' ] ,
version : 1 ,
2021-07-03 05:40:16 -07:00
description : 'Starts the workflow when GetResponse events occur' ,
2021-02-07 14:32:12 -08:00
defaults : {
name : 'GetResponse Trigger' ,
} ,
inputs : [ ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'getResponseApi' ,
required : true ,
displayOptions : {
show : {
authentication : [
'apiKey' ,
] ,
} ,
} ,
} ,
{
name : 'getResponseOAuth2Api' ,
required : true ,
displayOptions : {
show : {
authentication : [
'oAuth2' ,
] ,
} ,
} ,
} ,
] ,
webhooks : [
{
name : 'default' ,
httpMethod : 'GET' ,
responseMode : 'onReceived' ,
path : 'webhook' ,
} ,
] ,
properties : [
{
displayName : 'Authentication' ,
name : 'authentication' ,
type : 'options' ,
options : [
{
name : 'API Key' ,
value : 'apiKey' ,
} ,
{
name : 'OAuth2' ,
value : 'oAuth2' ,
} ,
] ,
default : 'apiKey' ,
} ,
{
displayName : 'Events' ,
name : 'events' ,
type : 'multiOptions' ,
options : [
{
name : 'Customer Subscribed' ,
value : 'subscribe' ,
2022-05-06 14:01:25 -07:00
description : 'Receive notifications when a customer is subscribed to a list' ,
2021-02-07 14:32:12 -08:00
} ,
{
name : 'Customer Unsubscribed' ,
value : 'unsubscribe' ,
2022-05-06 14:01:25 -07:00
description : 'Receive notifications when a customer is unsubscribed from a list' ,
2021-02-07 14:32:12 -08:00
} ,
{
name : 'Email Opened' ,
value : 'open' ,
2022-05-06 14:01:25 -07:00
description : 'Receive notifications when a email is opened' ,
2021-02-07 14:32:12 -08:00
} ,
{
name : 'Email Clicked' ,
value : 'click' ,
2022-05-06 14:01:25 -07:00
description : 'Receive notifications when a email is clicked' ,
2021-02-07 14:32:12 -08:00
} ,
{
name : 'Survey Submitted' ,
value : 'survey' ,
2022-05-06 14:01:25 -07:00
description : 'Receive notifications when a survey is submitted' ,
2021-02-07 14:32:12 -08:00
} ,
] ,
default : [ ] ,
required : true ,
} ,
{
displayName : 'List IDs' ,
name : 'listIds' ,
type : 'multiOptions' ,
typeOptions : {
loadOptionsMethod : 'getLists' ,
} ,
default : [ ] ,
} ,
{
displayName : 'Options' ,
name : 'options' ,
placeholder : 'Add Option' ,
type : 'collection' ,
default : { } ,
options : [
{
displayName : 'Delete Current Subscription' ,
name : 'delete' ,
type : 'boolean' ,
default : false ,
2022-05-06 14:01:25 -07:00
description : 'Delete the current subscription' ,
2021-02-07 14:32:12 -08:00
} ,
] ,
} ,
] ,
} ;
methods = {
loadOptions : {
// Get all the available teams to display them to user so that he can
// select them easily
async getLists ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const returnData : INodePropertyOptions [ ] = [ ] ;
const lists = await getResponseApiRequestAllItems . call ( this , 'GET' , '/campaigns' ) ;
returnData . push ( { name : '*' , value : '*' } ) ;
for ( const list of lists ) {
returnData . push ( {
name : list.name ,
value : list.campaignId ,
} ) ;
}
return returnData ;
} ,
} ,
} ;
// @ts-ignore (because of request)
webhookMethods = {
default : {
async checkExists ( this : IHookFunctions ) : Promise < boolean > {
const webhookUrl = this . getNodeWebhookUrl ( 'default' ) ;
const deleteCurrentSubscription = this . getNodeParameter ( 'options.delete' , false ) as boolean ;
try {
const data = await getresponseApiRequest . call ( this , 'GET' , '/accounts/callbacks' , { } ) ;
if ( data . url !== webhookUrl ) {
if ( deleteCurrentSubscription === false ) {
2021-04-16 09:33:36 -07:00
throw new NodeApiError ( this . getNode ( ) , data , { message : ` The webhook ( ${ data . url } ) is active in the account. Delete it manually or set the parameter "Delete Current Subscription" to true, and the node will delete it for you. ` } ) ;
2021-02-07 14:32:12 -08:00
}
}
} catch ( error ) {
2021-04-30 19:12:11 -07:00
if ( error . httpCode === '404' ) {
2021-02-07 14:32:12 -08:00
return false ;
}
}
await getresponseApiRequest . call ( this , 'DELETE' , '/accounts/callbacks' ) ;
return false ;
} ,
async create ( this : IHookFunctions ) : Promise < boolean > {
const webhookUrl = this . getNodeWebhookUrl ( 'default' ) ;
const events = this . getNodeParameter ( 'events' ) as string [ ] ;
const body = {
url : webhookUrl ,
actions : events.reduce ( ( accumulator : { [ key : string ] : boolean } , currentValue : string ) = > {
accumulator [ currentValue ] = true ;
return accumulator ;
} , { } ) ,
} ;
await getresponseApiRequest . call ( this , 'POST' , '/accounts/callbacks' , body ) ;
return true ;
} ,
async delete ( this : IHookFunctions ) : Promise < boolean > {
try {
await getresponseApiRequest . call ( this , 'DELETE' , '/accounts/callbacks' ) ;
2021-04-16 09:33:36 -07:00
} catch ( error ) {
2021-02-07 14:32:12 -08:00
return false ;
}
return true ;
} ,
} ,
} ;
async webhook ( this : IWebhookFunctions ) : Promise < IWebhookResponseData > {
const query = this . getQueryData ( ) as IDataObject ;
const listIds = this . getNodeParameter ( 'listIds' ) as string [ ] ;
if ( ! listIds . includes ( '*' ) && ! listIds . includes ( query [ 'CAMPAIGN_ID' ] as string ) ) {
return { } ;
}
return {
workflowData : [
this . helpers . returnJsonArray ( query ) ,
] ,
} ;
}
}