2022-10-11 07:07:36 -07:00
import {
IHookFunctions ,
ILoadOptionsFunctions ,
INodePropertyOptions ,
INodeType ,
INodeTypeDescription ,
IWebhookFunctions ,
IWebhookResponseData ,
} from 'n8n-workflow' ;
2022-10-07 06:48:45 -07:00
import { venafiApiRequest } from './GenericFunctions' ;
export class VenafiTlsProtectCloudTrigger implements INodeType {
description : INodeTypeDescription = {
displayName : 'Venafi TLS Protect Cloud Trigger' ,
name : 'venafiTlsProtectCloudTrigger' ,
icon : 'file:../venafi.svg' ,
group : [ 'trigger' ] ,
version : 1 ,
2022-10-25 00:06:54 -07:00
description : 'Starts the workflow when Venafi events occur' ,
2022-10-07 06:48:45 -07:00
defaults : {
2022-10-11 07:07:36 -07:00
name : 'Venafi TLS Protect Cloud Trigger' ,
2022-10-07 06:48:45 -07:00
} ,
credentials : [
{
name : 'venafiTlsProtectCloudApi' ,
required : true ,
} ,
] ,
2022-10-11 07:07:36 -07:00
webhooks : [
{
name : 'default' ,
httpMethod : 'POST' ,
responseMode : 'onReceived' ,
path : 'webhook' ,
} ,
] ,
2022-10-07 06:48:45 -07:00
inputs : [ ] ,
outputs : [ 'main' ] ,
properties : [
{
2022-10-11 07:07:36 -07:00
// eslint-disable-next-line n8n-nodes-base/node-param-display-name-wrong-for-dynamic-options
displayName : 'Resource' ,
name : 'resource' ,
2022-10-07 06:48:45 -07:00
type : 'options' ,
2022-10-11 07:07:36 -07:00
noDataExpression : true ,
typeOptions : {
loadOptionsMethod : 'getActivityTypes' ,
} ,
required : true ,
default : [ ] ,
description :
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
} ,
{
// eslint-disable-next-line n8n-nodes-base/node-param-display-name-wrong-for-dynamic-multi-options
displayName : 'Trigger On' ,
name : 'triggerOn' ,
type : 'multiOptions' ,
typeOptions : {
loadOptionsMethod : 'getActivitySubTypes' ,
loadOptionsDependsOn : [ 'resource' ] ,
} ,
2022-10-07 06:48:45 -07:00
required : true ,
2022-10-11 07:07:36 -07:00
default : [ ] ,
description :
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2022-10-07 06:48:45 -07:00
} ,
] ,
} ;
2022-10-11 07:07:36 -07:00
methods = {
loadOptions : {
async getActivityTypes ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const activitytypes = await venafiApiRequest . call ( this , 'GET' , '/v1/activitytypes' ) ;
return activitytypes . map (
( { key , readableName } : { key : string ; readableName : string } ) = > ( {
name : readableName ,
value : key ,
} ) ,
) ;
} ,
async getActivitySubTypes ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
const resource = this . getCurrentNodeParameter ( 'resource' ) as string ;
const activitytypes = await venafiApiRequest . call ( this , 'GET' , '/v1/activitytypes' ) ;
const activity = activitytypes . find ( ( { key } : { key : string } ) = > key === resource ) as {
values : [ { key : string ; readableName : string } ] ;
} ;
2022-10-25 00:06:54 -07:00
const subActivities = activity . values . map ( ( { key , readableName } ) = > ( {
name : readableName ,
value : key ,
} ) ) ;
2022-10-11 07:07:36 -07:00
subActivities . unshift ( { name : '[All]' , value : '*' } ) ;
return subActivities ;
} ,
} ,
} ;
2022-10-07 06:48:45 -07:00
2022-10-11 07:07:36 -07:00
webhookMethods = {
default : {
async checkExists ( this : IHookFunctions ) : Promise < boolean > {
const webhookUrl = this . getNodeWebhookUrl ( 'default' ) ;
2022-10-07 06:48:45 -07:00
2022-10-11 07:07:36 -07:00
const { connectors } = await venafiApiRequest . call ( this , 'GET' , '/v1/connectors' ) ;
2022-10-07 06:48:45 -07:00
2022-10-11 07:07:36 -07:00
for ( const connector of connectors ) {
const {
id ,
properties : {
target : {
connection : { url } ,
} ,
2022-10-07 06:48:45 -07:00
} ,
2022-10-11 07:07:36 -07:00
} = connector ;
if ( url === webhookUrl ) {
await venafiApiRequest . call ( this , 'DELETE' , ` /v1/connectors/ ${ id } ` ) ;
return false ;
}
}
return false ;
} ,
async create ( this : IHookFunctions ) : Promise < boolean > {
const webhookUrl = this . getNodeWebhookUrl ( 'default' ) ;
const resource = this . getNodeParameter ( 'resource' ) as string ;
const body = {
name : ` n8n-webhook ( ${ webhookUrl } ) ` ,
properties : {
connectorKind : 'WEBHOOK' ,
target : {
type : 'generic' ,
connection : {
url : webhookUrl ,
} ,
2022-10-07 06:48:45 -07:00
} ,
2022-10-11 07:07:36 -07:00
filter : {
activityTypes : [ resource ] ,
} ,
} ,
} ;
const responseData = await venafiApiRequest . call ( this , 'POST' , ` /v1/connectors ` , body ) ;
if ( responseData . id === undefined ) {
// Required data is missing so was not successful
return false ;
}
const webhookData = this . getWorkflowStaticData ( 'node' ) ;
webhookData . webhookId = responseData . id as string ;
return true ;
} ,
async delete ( this : IHookFunctions ) : Promise < boolean > {
const webhookData = this . getWorkflowStaticData ( 'node' ) ;
if ( webhookData . webhookId !== undefined ) {
try {
await venafiApiRequest . call ( this , 'DELETE' , ` /v1/connectors/ ${ webhookData . webhookId } ` ) ;
} catch ( error ) {
return false ;
}
// Remove from the static workflow data so that it is clear
// that no webhooks are registred anymore
delete webhookData . webhookId ;
}
return true ;
2022-10-07 06:48:45 -07:00
} ,
2022-10-11 07:07:36 -07:00
} ,
} ;
2022-10-07 06:48:45 -07:00
2022-10-11 07:07:36 -07:00
async webhook ( this : IWebhookFunctions ) : Promise < IWebhookResponseData > {
const bodyData = this . getBodyData ( ) as { message : string ; eventName : string } ;
const triggerOn = this . getNodeParameter ( 'triggerOn' ) as string ;
2022-10-07 06:48:45 -07:00
2022-10-11 07:07:36 -07:00
if ( Object . keys ( bodyData ) . length === 1 && bodyData . message ) {
// Is a create webhook confirmation request
const res = this . getResponseObject ( ) ;
res . status ( 200 ) . end ( ) ;
return {
noWebhookResponse : true ,
} ;
2022-10-07 06:48:45 -07:00
}
2022-10-11 07:07:36 -07:00
if ( ! triggerOn . includes ( '*' ) && ! triggerOn . includes ( bodyData . eventName ) ) return { } ;
return {
workflowData : [ this . helpers . returnJsonArray ( bodyData ) ] ,
} ;
2022-10-07 06:48:45 -07:00
}
}