2020-01-17 18:08:29 -08:00
import {
IHookFunctions ,
IWebhookFunctions ,
} from 'n8n-core' ;
import {
IDataObject ,
INodeType ,
2020-10-01 05:01:39 -07:00
INodeTypeDescription ,
2020-01-17 18:08:29 -08:00
IWebhookResponseData ,
} from 'n8n-workflow' ;
import {
acuitySchedulingApiRequest ,
} from './GenericFunctions' ;
export class AcuitySchedulingTrigger implements INodeType {
description : INodeTypeDescription = {
displayName : 'Acuity Scheduling Trigger' ,
2020-01-18 09:10:46 -08:00
name : 'acuitySchedulingTrigger' ,
2022-06-20 07:54:01 -07:00
// eslint-disable-next-line n8n-nodes-base/node-class-description-icon-not-svg
2020-01-17 18:08:29 -08:00
icon : 'file:acuityScheduling.png' ,
group : [ 'trigger' ] ,
version : 1 ,
description : 'Handle Acuity Scheduling events via webhooks' ,
defaults : {
name : 'Acuity Scheduling Trigger' ,
} ,
inputs : [ ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'acuitySchedulingApi' ,
required : true ,
2020-06-16 00:27:47 -07:00
displayOptions : {
show : {
authentication : [
2020-07-23 16:49:07 -07:00
'apiKey' ,
2020-06-16 00:27:47 -07:00
] ,
} ,
} ,
} ,
{
name : 'acuitySchedulingOAuth2Api' ,
required : true ,
displayOptions : {
show : {
authentication : [
'oAuth2' ,
] ,
} ,
} ,
} ,
2020-01-17 18:08:29 -08:00
] ,
webhooks : [
{
name : 'default' ,
httpMethod : 'POST' ,
responseMode : 'onReceived' ,
path : 'webhook' ,
} ,
] ,
properties : [
2020-06-16 00:27:47 -07:00
{
displayName : 'Authentication' ,
name : 'authentication' ,
type : 'options' ,
options : [
{
2020-07-23 16:49:07 -07:00
name : 'API Key' ,
value : 'apiKey' ,
2020-06-16 00:27:47 -07:00
} ,
{
name : 'OAuth2' ,
value : 'oAuth2' ,
} ,
] ,
2020-07-23 16:49:07 -07:00
default : 'apiKey' ,
2020-06-16 00:27:47 -07:00
} ,
2020-01-17 18:08:29 -08:00
{
displayName : 'Event' ,
name : 'event' ,
type : 'options' ,
required : true ,
default : '' ,
options : [
{
name : 'appointment.canceled' ,
value : 'appointment.canceled' ,
2022-06-03 10:23:49 -07:00
description : 'Is called whenever an appointment is canceled' ,
2020-01-17 18:08:29 -08:00
} ,
{
name : 'appointment.changed' ,
value : 'appointment.changed' ,
2022-06-03 10:23:49 -07:00
description : 'Is called when the appointment is changed in any way' ,
} ,
{
name : 'appointment.rescheduled' ,
value : 'appointment.rescheduled' ,
description : 'Is called when the appointment is rescheduled to a new time' ,
} ,
{
name : 'appointment.scheduled' ,
value : 'appointment.scheduled' ,
description : 'Is called once when an appointment is initially booked' ,
2020-01-17 18:08:29 -08:00
} ,
{
name : 'order.completed' ,
value : 'order.completed' ,
2022-06-03 10:23:49 -07:00
description : 'Is called when an order is completed' ,
2020-01-17 18:08:29 -08:00
} ,
] ,
} ,
2020-01-18 09:10:46 -08:00
{
displayName : 'Resolve Data' ,
name : 'resolveData' ,
type : 'boolean' ,
default : true ,
2022-06-20 07:54:01 -07:00
// eslint-disable-next-line n8n-nodes-base/node-param-description-boolean-without-whether
2021-11-25 09:10:06 -08:00
description : 'By default does the webhook-data only contain the ID of the object. If this option gets activated, it will resolve the data automatically.' ,
2020-01-18 09:10:46 -08:00
} ,
2020-01-17 18:08:29 -08:00
] ,
} ;
// @ts-ignore
webhookMethods = {
default : {
async checkExists ( this : IHookFunctions ) : Promise < boolean > {
const webhookData = this . getWorkflowStaticData ( 'node' ) ;
if ( webhookData . webhookId === undefined ) {
return false ;
}
const endpoint = '/webhooks' ;
const webhooks = await acuitySchedulingApiRequest . call ( this , 'GET' , endpoint ) ;
if ( Array . isArray ( webhooks ) ) {
for ( const webhook of webhooks ) {
if ( webhook . id === webhookData . webhookId ) {
return true ;
}
}
}
return false ;
} ,
async create ( this : IHookFunctions ) : Promise < boolean > {
const webhookUrl = this . getNodeWebhookUrl ( 'default' ) ;
const webhookData = this . getWorkflowStaticData ( 'node' ) ;
const event = this . getNodeParameter ( 'event' ) as string ;
const endpoint = '/webhooks' ;
const body : IDataObject = {
target : webhookUrl ,
event ,
} ;
const { id } = await acuitySchedulingApiRequest . call ( this , 'POST' , endpoint , body ) ;
webhookData . webhookId = id ;
return true ;
} ,
async delete ( this : IHookFunctions ) : Promise < boolean > {
const webhookData = this . getWorkflowStaticData ( 'node' ) ;
const endpoint = ` /webhooks/ ${ webhookData . webhookId } ` ;
try {
await acuitySchedulingApiRequest . call ( this , 'DELETE' , endpoint ) ;
} catch ( error ) {
return false ;
}
delete webhookData . webhookId ;
return true ;
} ,
} ,
} ;
async webhook ( this : IWebhookFunctions ) : Promise < IWebhookResponseData > {
const req = this . getRequestObject ( ) ;
2020-01-18 09:10:46 -08:00
const resolveData = this . getNodeParameter ( 'resolveData' , false ) as boolean ;
if ( resolveData === false ) {
// Return the data as it got received
return {
workflowData : [
this . helpers . returnJsonArray ( req . body ) ,
] ,
} ;
}
// Resolve the data by requesting the information via API
const event = this . getNodeParameter ( 'event' , false ) as string ;
const eventType = event . split ( '.' ) . shift ( ) ;
const endpoint = ` / ${ eventType } s/ ${ req . body . id } ` ;
const responseData = await acuitySchedulingApiRequest . call ( this , 'GET' , endpoint , { } ) ;
2020-01-17 18:08:29 -08:00
return {
workflowData : [
2020-01-18 09:10:46 -08:00
this . helpers . returnJsonArray ( responseData ) ,
2020-01-17 18:08:29 -08:00
] ,
} ;
2020-01-18 09:10:46 -08:00
2020-01-17 18:08:29 -08:00
}
}