n8n-nodes-base
Version:
Base nodes of n8n
205 lines • 8.68 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.GoogleCalendarTrigger = void 0;
const moment_timezone_1 = __importDefault(require("moment-timezone"));
const n8n_workflow_1 = require("n8n-workflow");
const GenericFunctions_1 = require("./GenericFunctions");
class GoogleCalendarTrigger {
description = {
displayName: 'Google Calendar Trigger',
name: 'googleCalendarTrigger',
icon: 'file:googleCalendar.svg',
group: ['trigger'],
version: 1,
subtitle: '={{$parameter["triggerOn"]}}',
description: 'Starts the workflow when Google Calendar events occur',
defaults: {
name: 'Google Calendar Trigger',
},
inputs: [],
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
credentials: [
{
name: 'googleCalendarOAuth2Api',
required: true,
},
],
polling: true,
properties: [
{
displayName: 'Calendar',
name: 'calendarId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
description: 'Google Calendar to operate on',
modes: [
{
displayName: 'Calendar',
name: 'list',
type: 'list',
placeholder: 'Select a Calendar...',
typeOptions: {
searchListMethod: 'getCalendars',
searchable: true,
},
},
{
displayName: 'ID',
name: 'id',
type: 'string',
validation: [
{
type: 'regex',
properties: {
// calendar ids are emails. W3C email regex with optional trailing whitespace.
regex: '(^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:[ \t]+)*$)',
errorMessage: 'Not a valid Google Calendar ID',
},
},
],
extractValue: {
type: 'regex',
regex: '(^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)',
},
placeholder: 'name@google.com',
},
],
},
{
displayName: 'Trigger On',
name: 'triggerOn',
type: 'options',
required: true,
default: '',
options: [
{
name: 'Event Cancelled',
value: 'eventCancelled',
},
{
name: 'Event Created',
value: 'eventCreated',
},
{
name: 'Event Ended',
value: 'eventEnded',
},
{
name: 'Event Started',
value: 'eventStarted',
},
{
name: 'Event Updated',
value: 'eventUpdated',
},
],
},
{
displayName: 'Options',
name: 'options',
type: 'collection',
placeholder: 'Add option',
default: {},
options: [
{
displayName: 'Match Term',
name: 'matchTerm',
type: 'string',
default: '',
description: 'Free text search terms to filter events that match these terms in any field, except for extended properties',
},
],
},
],
};
methods = {
listSearch: {
getCalendars: GenericFunctions_1.getCalendars,
},
};
async poll() {
const poolTimes = this.getNodeParameter('pollTimes.item', []);
const triggerOn = this.getNodeParameter('triggerOn', '');
const calendarId = (0, GenericFunctions_1.encodeURIComponentOnce)(this.getNodeParameter('calendarId', '', { extractValue: true }));
const webhookData = this.getWorkflowStaticData('node');
const matchTerm = this.getNodeParameter('options.matchTerm', '');
if (poolTimes.length === 0) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Please set a poll time');
}
if (triggerOn === '') {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Please select an event');
}
if (calendarId === '') {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Please select a calendar');
}
const now = (0, moment_timezone_1.default)().utc().format();
const startDate = webhookData.lastTimeChecked || now;
const endDate = now;
const qs = {
showDeleted: false,
};
if (matchTerm !== '') {
qs.q = matchTerm;
}
let events;
if (triggerOn === 'eventCreated' ||
triggerOn === 'eventUpdated' ||
triggerOn === 'eventCancelled') {
Object.assign(qs, {
updatedMin: startDate,
orderBy: 'updated',
showDeleted: triggerOn === 'eventCancelled',
});
}
else if (triggerOn === 'eventStarted' || triggerOn === 'eventEnded') {
Object.assign(qs, {
singleEvents: true,
timeMin: (0, moment_timezone_1.default)(startDate).startOf('second').utc().format(),
timeMax: (0, moment_timezone_1.default)(endDate).endOf('second').utc().format(),
orderBy: 'startTime',
});
}
if (this.getMode() === 'manual') {
delete qs.updatedMin;
delete qs.timeMin;
delete qs.timeMax;
qs.maxResults = 1;
events = await GenericFunctions_1.googleApiRequest.call(this, 'GET', `/calendar/v3/calendars/${calendarId}/events`, {}, qs);
events = events.items;
}
else {
events = await GenericFunctions_1.googleApiRequestAllItems.call(this, 'items', 'GET', `/calendar/v3/calendars/${calendarId}/events`, {}, qs);
if (triggerOn === 'eventCreated') {
events = events.filter((event) => (0, moment_timezone_1.default)(event.created).isBetween(startDate, endDate));
}
else if (triggerOn === 'eventUpdated' || triggerOn === 'eventCancelled') {
events = events.filter((event) => !(0, moment_timezone_1.default)((0, moment_timezone_1.default)(event.created).format('YYYY-MM-DDTHH:mm:ss')).isSame((0, moment_timezone_1.default)(event.updated).format('YYYY-MM-DDTHH:mm:ss')));
if (triggerOn === 'eventCancelled') {
events = events.filter((event) => event.status === 'cancelled');
}
}
else if (triggerOn === 'eventStarted') {
events = events.filter((event) => (0, moment_timezone_1.default)(event.start.dateTime).isBetween(startDate, endDate, null, '[]'));
}
else if (triggerOn === 'eventEnded') {
events = events.filter((event) => (0, moment_timezone_1.default)(event.end.dateTime).isBetween(startDate, endDate, null, '[]'));
}
}
webhookData.lastTimeChecked = endDate;
if (Array.isArray(events) && events.length) {
return [this.helpers.returnJsonArray(events)];
}
if (this.getMode() === 'manual') {
throw new n8n_workflow_1.NodeApiError(this.getNode(), {
message: 'No data with the current filter could be found',
});
}
return null;
}
}
exports.GoogleCalendarTrigger = GoogleCalendarTrigger;
//# sourceMappingURL=GoogleCalendarTrigger.node.js.map