UNPKG

n8n-nodes-base

Version:

Base nodes of n8n

205 lines 8.68 kB
"use strict"; 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