2023-01-27 03:22:44 -08:00
import type {
2022-10-11 07:07:36 -07:00
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 : {
feat(editor): Node creator actions (#4696)
* WIP: Node Actions List UI
* WIP: Recommended Actions and preseting of fields
* WIP: Resource category
* :art: Moved actions categorisation to the server
* :label: Add missing INodeAction type
* :sparkles: Improve SSR categorisation, fix adding of mixed actions
* :recycle: Refactor CategorizedItems to composition api, style fixes
* WIP: Adding multiple nodes
* :recycle: Refactor rest of the NodeCreator component to composition API, conver globalLinkActions to composable
* :sparkles: Allow actions dragging, fix search and refactor passing of actions to categorized items
* :lipstick: Fix node actions title
* Migrate to the pinia store, add posthog feature and various fixes
* :bug: Fix filtering of trigger actions when not merged
* fix: N8N-5439 — Do not use simple node item when at NodeHelperPanel root
* :bug: Design review fixes
* :bug: Fix disabling of merged actions
* Fix trigger root filtering
* :sparkles: Allow for custom node actions parser, introduce hubspot parser
* :bug: Fix initial node params validation, fix position of second added node
* :bug: Introduce operations category, removed canvas node names overrride, fix API actions display and prevent dragging of action nodes
* :sparkles: Prevent NDV auto-open feature flag
* :bug: Inject recommened action for trigger nodes without actions
* Refactored NodeCreatorNode to Storybook, change filtering of merged nodes for the trigger helper panel, minor fixes
* Improve rendering of app nodes and animation
* Cleanup, any only enable accordion transition on triggerhelperpanel
* Hide node creator scrollbars in Firefox
* Minor styles fixes
* Do not copy the array in rendering method
* Removed unused props
* Fix memory leak
* Fix categorisation of regular nodes with a single resource
* Implement telemetry calls for node actions
* Move categorization to FE
* Fix client side actions categorisation
* Skip custom action show
* Only load tooltip for NodeIcon if necessary
* Fix lodash startCase import
* Remove lodash.startcase
* Cleanup
* Fix node creator autofocus on "tab"
* Prevent posthog getFeatureFlag from crashing
* Debugging preview env search issues
* Remove logs
* Make sure the pre-filled params are update not overwritten
* Get rid of transition in itemiterator
* WIP: Rough version of NodeActions keyboard navigation, replace nodeCreator composable with Pinia store module
* Rewrite to add support for ActionItem to ItemIterator and make CategorizedItems accept items props
* Fix category item counter & cleanup
* Add APIHint to actions search no-result, clean up NodeCreatorNode
* Improve node actions no results message
* Remove logging, fix filtering of recommended placeholder category
* Remove unused NodeActions component and node merging feature falg
* Do not show regular nodes without actions
* Make sure to add manual trigger when adding http node via actions hint
* Fixed api hint footer line height
* Prevent pointer-events od NodeIcon img and remove "this" from template
* Address PR points
* Fix e2e specs
* Make sure canvas ia loaded
* Make sure canvas ia loaded before opening nodeCreator in e2e spec
* Fix flaky workflows tags e2e getter
* Imrpove node creator click outside UX, add manual node to regular nodes added from trigger panel
* Add manual trigger node if dragging regular from trigger panel
2022-12-09 01:56:36 -08: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 ] ,
} ,
} ,
} ;
2022-12-29 03:20:43 -08:00
const responseData = await venafiApiRequest . call ( this , 'POST' , '/v1/connectors' , body ) ;
2022-10-11 07:07:36 -07:00
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
}
}