n8n/packages/nodes-base/nodes/Cal/CalTrigger.node.ts
Syed Ali Shahbaz 1fa445e0e7
feat(Cal Trigger Node): Add cal.com Trigger Node (#3439)
* options and operations added

* IT WORKS!

* Added ReturnALL to GET method

* comit for PR

* updating shared operations

*  linter fixes

*  improvements

*  lock file fix

*  credentials update

* added cal trigger node

* Removed console log

* Added advanced fields

* feat(core): Add support for pairedItem (beta) (#3012)

*  Add pairedItem support

* 👕 Fix lint issue

* 🐛 Fix resolution in frontend

* 🐛 Fix resolution issue

* 🐛 Fix resolution in frontend

* 🐛 Fix another resolution issue in frontend

*  Try to automatically add pairedItem data if possible

*  Cleanup

*  Display expression errors in editor UI

* 🐛 Fix issue that it did not display errors in production

* 🐛 Fix auto-fix of missing pairedItem data

* 🐛 Fix frontend resolution for not executed nodes

*  Fail execution on pairedItem resolve issue and display information
about itemIndex and runIndex

*  Allow that pairedItem is only set to number if runIndex is 0

*  Improve Expression Errors

*  Remove no longer needed code

*  Make errors more helpful

*  Add additional errors

* 👕 Fix lint issue

*  Add pairedItem support to core nodes

*  Improve support in Merge-Node

*  Fix issue with not correctly converted incoming pairedItem data

* 🐛 Fix frontend resolve issue

* 🐛 Fix frontend parameter name display issue

*  Improve errors

* 👕 Fix lint issue

*  Improve errors

*  Make it possible to display parameter name in error messages

*  Improve error messages

*  Fix error message

*  Improve error messages

*  Add another error message

*  Simplify

* refactor(core): Deduplicate encryption logic (#3434)

*  added function to credentials helper

* Refactor function name

* Fix lint issues

Co-authored-by: Michael Kret <michael.k@radency.com>

* test: Add timeout to `beforeAll` in users suite (#3433)

* refactor(editor): Change node-setting's parameters order (#3435)

* fix(core): Fix `user-management:reset` command (#3403)

* 🐛 Fix `email` setting

* 🧪 Add test

* 🧪 Add expectation for user email

*  Replace request with helper

* refactor: Apply more `eslint-plugin-n8n-nodes-base` autofixable rules (#3432)

*  Update `lintfix` script

* 👕 Remove unneeded lint exceptions

* 👕 Run baseline `lintfix`

* 👕 Apply `node-param-description-miscased-url` (#3441)

* 👕 Apply `rule node-param-placeholder-miscased-id` (#3443)

Co-authored-by: Iván Ovejero <ivov.src@gmail.com>

* 👕 Apply `node-param-option-name-wrong-for-upsert` (#3446)

* 👕 Apply `node-param-min-value-wrong-for-limit` (#3442)

Co-authored-by: Iván Ovejero <ivov.src@gmail.com>

* Apply `node-param-display-name-wrong-for-dynamic-options` (#3454)

* 🔨 fix

*  Fix `Assigned To` fields

Co-authored-by: Michael Kret <michael.k@radency.com>

* 👕 Apply `rule node-param-default-wrong-for-number` (#3453)

* 👕 Apply `node-param-default-wrong-for-string` (#3452)

Co-authored-by: Iván Ovejero <ivov.src@gmail.com>

* Apply `node-param-display-name-miscased` (#3449)

* 🔨 fix

* 🔨 exceptions

*  review fixes

* 👕 Apply `node-param-description-lowercase-first-char` (#3451)

*  fix

*  review fixes

*  fix

Co-authored-by: Iván Ovejero <ivov.src@gmail.com>

* 👕 Apply `node-param-description-wrong-for-dynamic-options` (#3456)

* Rule working as intended

* Add rule

* 🔥 Remove repetitions

* 👕 Add exceptions

Co-authored-by: Iván Ovejero <ivov.src@gmail.com>

* 👕 Small fix for `node-param-description-wrong-for-dynamic-options`

* 👕 Apply `node-param-default-wrong-for-fixed-collection` (#3460)

* 👕 Apply `node-param-description-line-break-html-tag` (#3462)

* 👕 Run baseline `lintfix`

* 👕 Apply `node-param-options-type-unsorted-items` (#3459)

*  fix

* 🔨 exceptions

* Add exception for Salesmate and Zoom

Co-authored-by: Michael Kret <michael.k@radency.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>

*  Restore `lintfix` command

Co-authored-by: Omar Ajoue <krynble@gmail.com>
Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>
Co-authored-by: agobrech <45268029+agobrech@users.noreply.github.com>
Co-authored-by: Michael Kret <michael.k@radency.com>
Co-authored-by: brianinoa <54530642+brianinoa@users.noreply.github.com>

* fix(Hubspot Node): Fix loading of Contacts (#3426)

* feat(QuickBooks Node): Add optional Tax item field (#3404)

* Added tax refs

* Nodelinter fixes

* fix(EmailReadImap Node): Improve error handling (#3465)

* refactor(core): Remove a floating promise

*  Improvements

Co-authored-by: alex meredith <alexanderm@packt.com>
Co-authored-by: ajmeredith1200 <100841449+ajmeredith1200@users.noreply.github.com>
Co-authored-by: Michael Kret <michael.k@radency.com>
Co-authored-by: Jan Oberhauser <janober@users.noreply.github.com>
Co-authored-by: Omar Ajoue <krynble@gmail.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: Ricardo Espinoza <ricardo@n8n.io>
Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>
Co-authored-by: agobrech <45268029+agobrech@users.noreply.github.com>
Co-authored-by: brianinoa <54530642+brianinoa@users.noreply.github.com>
Co-authored-by: Jan Oberhauser <jan.oberhauser@gmail.com>
Co-authored-by: Jonathan Bennetts <jonathan.bennetts@gmail.com>
2022-06-05 19:30:54 +02:00

207 lines
4.9 KiB
TypeScript

import {
IHookFunctions,
IWebhookFunctions,
} from 'n8n-core';
import {
ILoadOptionsFunctions,
INodePropertyOptions,
INodeType,
INodeTypeDescription,
IWebhookResponseData,
} from 'n8n-workflow';
import {
calApiRequest,
sortOptionParameters,
} from './GenericFunctions';
export class CalTrigger implements INodeType {
description: INodeTypeDescription = {
displayName: 'Cal Trigger',
name: 'calTrigger',
icon: 'file:cal.svg',
group: ['trigger'],
version: 1,
subtitle: '=Events: {{$parameter["events"].join(", ")}}',
description: 'Handle Cal events via webhooks',
defaults: {
name: 'Cal Trigger',
color: '#888',
},
inputs: [],
outputs: ['main'],
credentials: [
{
name: 'calApi',
required: true,
},
],
webhooks: [
{
name: 'default',
httpMethod: 'POST',
responseMode: 'onReceived',
path: 'webhook',
},
],
properties: [
{
displayName: 'Events',
name: 'events',
type: 'multiOptions',
options: [
{
name: 'Booking Created',
value: 'BOOKING_CREATED',
description: 'Receive notifications when a new Cal event is created',
},
{
name: 'Booking Cancelled',
value: 'BOOKING_CANCELLED',
description: 'Receive notifications when a Cal event is canceled',
},
{
name: 'Booking Rescheduled',
value: 'BOOKING_RESCHEDULED',
description: 'Receive notifications when a Cal event is rescheduled',
},
],
default: [],
required: true,
},
{
displayName: 'Options',
name: 'options',
type: 'collection',
placeholder: 'Add Field',
default: {},
options: [
{
displayName: 'App ID',
name: 'appId',
type: 'string',
default: '',
},
{
displayName: 'EventType Name or ID',
name: 'eventTypeId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getEventTypes',
},
default: '',
},
{
displayName: 'Payload Template',
name: 'payloadTemplate',
type: 'string',
default: '',
typeOptions: {
rows: 4,
}
}
],
},
],
};
methods = {
loadOptions: {
async getEventTypes(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
const data = await calApiRequest.call(this, 'GET', '/event-types', {});
for (const item of data.event_types) {
returnData.push({
name: item.title,
value: item.id,
});
}
return sortOptionParameters(returnData);
},
},
};
// @ts-ignore (because of request)
webhookMethods = {
default: {
async checkExists(this: IHookFunctions): Promise<boolean> {
const webhookUrl = this.getNodeWebhookUrl('default');
const webhookData = this.getWorkflowStaticData('node');
const events = this.getNodeParameter('events') as string;
// Check all the webhooks which exist already if it is identical to the
// one that is supposed to get created.
const data = await calApiRequest.call(this, 'GET', '/hooks', {});
for (const webhook of data.webhooks) {
if (webhook.subscriberUrl === webhookUrl) {
for (const event of events) {
if (!webhook.eventTriggers.includes(event)) {
return false;
}
}
// Set webhook-id to be sure that it can be deleted
webhookData.webhookId = webhook.id as string;
return true;
}
}
return false;
},
async create(this: IHookFunctions): Promise<boolean> {
const webhookData = this.getWorkflowStaticData('node');
const subscriberUrl = this.getNodeWebhookUrl('default');
const eventTriggers = this.getNodeParameter('events') as string;
const options = this.getNodeParameter('options');
const active = true;
const body = {
subscriberUrl,
eventTriggers,
active,
...options as object
};
const responseData = await calApiRequest.call(this, 'POST', '/hooks', body);
if (responseData.webhook.id === undefined) {
// Required data is missing so was not successful
return false;
}
webhookData.webhookId = responseData.webhook.id as string;
return true;
},
async delete(this: IHookFunctions): Promise<boolean> {
const webhookData = this.getWorkflowStaticData('node');
if (webhookData.webhookId !== undefined) {
const endpoint = `/hooks/${webhookData.webhookId}`;
try {
await calApiRequest.call(this, 'DELETE', endpoint);
} 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;
},
},
};
async webhook(this: IWebhookFunctions): Promise<IWebhookResponseData> {
const req = this.getRequestObject();
return {
workflowData: [
this.helpers.returnJsonArray(req.body),
],
};
}
}