Files
n8n-enterprise-unlocked/packages/nodes-base/nodes/FormIo/FormIoTrigger.node.ts
Ricardo Espinoza 12417ea323 Add Form.io Trigger (#2064)
* Initial commit n8n smartsheet and formio nodes
1. created smarsheet node that can add new rew to a particular smarsheet.
2. created formio trigger node which will listen to form.io form submit event and process data.

* Added coloum mapping logic form.io field label to smarsheet column title.
API and smartsheet sheetId configuration added to smartsheet node.

* Added smartsheet api credentials and used it in smartsheet node.

* Added logos to the form.io and smartsheet nodes.
Removed smartsheet and form.io npm dependencies from the nodes.
Added type check for the variables used.
fixed tslint errors in the created nodes.

*  Improvements to #1943

*  Improvements

*  Improvements

*  Some fixes and improvements

Co-authored-by: Parthiban Chandrasekar <pbr.reddys@gmail.com>
Co-authored-by: Jan Oberhauser <jan.oberhauser@gmail.com>
2021-08-21 12:53:06 +02:00

206 lines
5.6 KiB
TypeScript

import {
IHookFunctions,
IWebhookFunctions,
} from 'n8n-core';
import {
ILoadOptionsFunctions,
INodePropertyOptions,
INodeType,
INodeTypeDescription,
IWebhookResponseData,
} from 'n8n-workflow';
import {
formIoApiRequest,
} from './GenericFunctions';
export class FormIoTrigger implements INodeType {
description: INodeTypeDescription = {
displayName: 'Form.io Trigger',
name: 'formIoTrigger',
icon: 'file:formio.svg',
group: ['trigger'],
version: 1,
subtitle: '={{$parameter["event"]}}',
description: 'Handle form.io events via webhooks',
defaults: {
name: 'Form.io Trigger',
color: '#6ad7b9',
},
inputs: [],
outputs: ['main'],
credentials: [
{
name: 'formIoApi',
required: true,
},
],
webhooks: [
{
name: 'default',
httpMethod: 'POST',
responseMode: 'onReceived',
path: 'webhook',
},
],
properties: [
{
displayName: 'Project Name/ID',
name: 'projectId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getProjects',
},
required: true,
default: '',
description: `Choose from the list or specify an ID. You can also specify the ID using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions" target="_blank" >expression</a>`
},
{
displayName: 'Form Name/ID',
name: 'formId',
type: 'options',
typeOptions: {
loadOptionsDependsOn: [
'projectId',
],
loadOptionsMethod: 'getForms',
},
required: true,
default: '',
description: `Choose from the list or specify an ID. You can also specify the ID using an <a href="https://docs.n8n.io/nodes/expressions.html#expressions" target="_blank" >expression</a>`
},
{
displayName: 'Trigger Events',
name: 'events',
type: 'multiOptions',
options: [
{
name: 'Submission Created',
value: 'create',
},
{
name: 'Submission Updated',
value: 'update',
},
],
required: true,
default: '',
},
{
displayName: 'Simplify Response',
name: 'simple',
type: 'boolean',
default: true,
description: 'Return a simplified version of the response instead of the raw data',
},
],
};
methods = {
loadOptions: {
async getProjects(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const projects = await formIoApiRequest.call(this, 'GET', '/project', {});
const returnData: INodePropertyOptions[] = [];
for (const project of projects) {
returnData.push({
name: project.title,
value: project._id,
});
}
return returnData;
},
async getForms(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const projectId = this.getCurrentNodeParameter('projectId') as string;
const forms = await formIoApiRequest.call(this, 'GET', `/project/${projectId}/form`, {});
const returnData: INodePropertyOptions[] = [];
for (const form of forms) {
returnData.push({
name: form.title,
value: form._id,
});
}
return returnData;
},
},
};
// @ts-ignore
webhookMethods = {
default: {
async checkExists(this: IHookFunctions): Promise<boolean> {
const webhookData = this.getWorkflowStaticData('node');
const webhookUrl = this.getNodeWebhookUrl('default');
const formId = this.getNodeParameter('formId') as string;
const projectId = this.getNodeParameter('projectId') as string;
const method = this.getNodeParameter('events') as string[];
const actions = await formIoApiRequest.call(this, 'GET', `/project/${projectId}/form/${formId}/action`);
for (const action of actions) {
if (action.name === 'webhook') {
if (action.settings.url === webhookUrl &&
// tslint:disable-next-line: no-any
(action.method.length === method.length && action.method.every((value: any) => method.includes(value)))) {
webhookData.webhookId = action._id;
return true;
}
}
}
return false;
},
async create(this: IHookFunctions): Promise<boolean> {
const webhookData = this.getWorkflowStaticData('node');
const formId = this.getNodeParameter('formId') as string;
const projectId = this.getNodeParameter('projectId') as string;
const webhookUrl = this.getNodeWebhookUrl('default') as string;
const method = this.getNodeParameter('events') as string[];
const payload = {
data: {
name: `webhook`,
title: `webhook-n8n:${webhookUrl}`,
method,
handler: [
'after',
],
priority: 0,
settings: {
method: 'post',
block: false,
url: webhookUrl,
},
condition: {
field: 'submit',
},
},
};
const webhook = await formIoApiRequest.call(this, 'POST', `/project/${projectId}/form/${formId}/action`, payload);
webhookData.webhookId = webhook._id;
return true;
},
async delete(this: IHookFunctions): Promise<boolean> {
const webhookData = this.getWorkflowStaticData('node');
const formId = this.getNodeParameter('formId') as string;
const projectId = this.getNodeParameter('projectId') as string;
await formIoApiRequest.call(this, 'DELETE', `/project/${projectId}/form/${formId}/action/${webhookData.webhookId}`);
delete webhookData.webhookId;
return true;
},
},
};
async webhook(this: IWebhookFunctions): Promise<IWebhookResponseData> {
const req = this.getRequestObject();
const simple = this.getNodeParameter('simple') as boolean;
let response = req.body.request;
if (simple === true) {
response = response.data;
}
return {
workflowData: [
this.helpers.returnJsonArray(response),
],
};
}
}