diff --git a/src/appmixer/microsoft/calendar/EventCreated/EventCreated.js b/src/appmixer/microsoft/calendar/EventCreated/EventCreated.js new file mode 100644 index 0000000000..397de14ddf --- /dev/null +++ b/src/appmixer/microsoft/calendar/EventCreated/EventCreated.js @@ -0,0 +1,105 @@ +'use strict'; + +const BASE_URL = 'https://graph.microsoft.com/v1.0'; +const CLIENT_STATE = 'appmixer.microsoft.calendar'; +const RENEW_BEFORE_MS = 300000; + +const getSubscriptionExpirationDateTime = () => { + // Max expiration for calendar subscriptions is 4230 minutes (< 3 days). + // Renew every 2 days to stay safe. + return new Date(Date.now() + 3000 * 60 * 1000); +}; + +module.exports = { + + async start(context) { + + const expirationDateTime = getSubscriptionExpirationDateTime(); + const { data } = await context.httpRequest({ + url: `${BASE_URL}/subscriptions`, + method: 'POST', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}`, + 'Content-Type': 'application/json', + accept: 'application/json' + }, + data: { + changeType: 'created', + notificationUrl: context.getWebhookUrl(), + resource: '/me/events', + expirationDateTime: expirationDateTime.toISOString(), + clientState: CLIENT_STATE + } + }); + + await context.saveState({ subscriptionId: data.id }); + return context.setTimeout({}, expirationDateTime - Date.now() - RENEW_BEFORE_MS); + }, + + async stop(context) { + + const { subscriptionId } = context.state; + if (subscriptionId) { + await context.httpRequest({ + url: `${BASE_URL}/subscriptions/${subscriptionId}`, + method: 'DELETE', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}` + } + }); + } + }, + + async receive(context) { + + if (context.messages.timeout) { + + const { subscriptionId } = context.state; + const expirationDateTime = getSubscriptionExpirationDateTime(); + + await context.httpRequest({ + url: `${BASE_URL}/subscriptions/${subscriptionId}`, + method: 'PATCH', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}`, + 'Content-Type': 'application/json', + accept: 'application/json' + }, + data: { expirationDateTime: expirationDateTime.toISOString() } + }); + + return context.setTimeout({}, expirationDateTime - Date.now() - RENEW_BEFORE_MS); + + } else if (context.messages.webhook) { + + const { data, query } = context.messages.webhook.content; + + if (query.validationToken) { + return context.response(query.validationToken, 200, { 'Content-type': 'text/plain' }); + } + + const value = data.value || []; + for (const notification of value) { + if (notification.clientState === CLIENT_STATE) { + try { + const { data: event } = await context.httpRequest({ + url: `https://graph.microsoft.com/v1.0/me/events/${notification.resourceData.id}`, + method: 'GET', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}`, + accept: 'application/json' + } + }); + await context.sendJson(event, 'out'); + } catch (err) { + // Event may no longer exist (e.g. deleted). Log and continue. + const resId = notification.resourceData?.id; + await context.log({ error: err.message, resId }); + } + } + } + + return context.response('', 200); + } + } +}; diff --git a/src/appmixer/microsoft/calendar/EventCreated/component.json b/src/appmixer/microsoft/calendar/EventCreated/component.json new file mode 100644 index 0000000000..f36bdad662 --- /dev/null +++ b/src/appmixer/microsoft/calendar/EventCreated/component.json @@ -0,0 +1,131 @@ +{ + "name": "appmixer.microsoft.calendar.EventCreated", + "author": "AppMixer ", + "label": "Event Created", + "description": "Trigger that fires when a new calendar event is created.", + "private": false, + "version": "1.0.0", + "webhook": true, + "auth": { + "service": "appmixer:microsoft", + "scope": [ + "Calendars.Read" + ] + }, + "quota": { + "manager": "appmixer:microsoft:calendar", + "maxWait": 5000, + "resources": "requests", + "scope": { + "userId": "{{userId}}" + } + }, + "outPorts": [ + { + "name": "out", + "options": [ + { + "label": "Event ID", + "value": "id" + }, + { + "label": "Subject", + "value": "subject" + }, + { + "label": "Body Preview", + "value": "bodyPreview" + }, + { + "label": "Body Content", + "value": "body.content" + }, + { + "label": "Body Content Type", + "value": "body.contentType" + }, + { + "label": "Web Link", + "value": "webLink" + }, + { + "label": "Start Date Time", + "value": "start.dateTime" + }, + { + "label": "Start Time Zone", + "value": "start.timeZone" + }, + { + "label": "End Date Time", + "value": "end.dateTime" + }, + { + "label": "End Time Zone", + "value": "end.timeZone" + }, + { + "label": "Location", + "value": "location.displayName" + }, + { + "label": "Organizer Name", + "value": "organizer.emailAddress.name" + }, + { + "label": "Organizer Email", + "value": "organizer.emailAddress.address" + }, + { + "label": "Attendees", + "value": "attendees" + }, + { + "label": "Is All Day", + "value": "isAllDay" + }, + { + "label": "Is Cancelled", + "value": "isCancelled" + }, + { + "label": "Created Date Time", + "value": "createdDateTime" + }, + { + "label": "Last Modified Date Time", + "value": "lastModifiedDateTime" + }, + { + "label": "Categories", + "value": "categories" + }, + { + "label": "Importance", + "value": "importance" + }, + { + "label": "Sensitivity", + "value": "sensitivity" + }, + { + "label": "Show As", + "value": "showAs" + }, + { + "label": "Recurrence", + "value": "recurrence" + }, + { + "label": "Online Meeting URL", + "value": "onlineMeetingUrl" + }, + { + "label": "Online Meeting", + "value": "onlineMeeting" + } + ] + } + ], + "icon": "data:image/png;base64,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" +} diff --git a/src/appmixer/microsoft/calendar/EventDeleted/EventDeleted.js b/src/appmixer/microsoft/calendar/EventDeleted/EventDeleted.js new file mode 100644 index 0000000000..0dfc3e7941 --- /dev/null +++ b/src/appmixer/microsoft/calendar/EventDeleted/EventDeleted.js @@ -0,0 +1,104 @@ +'use strict'; + +const BASE_URL = 'https://graph.microsoft.com/v1.0'; +const CLIENT_STATE = 'appmixer.microsoft.calendar'; +const RENEW_BEFORE_MS = 300000; + +const getSubscriptionExpirationDateTime = () => { + // Max expiration for calendar subscriptions is 4230 minutes (< 3 days). + // Renew every 2 days to stay safe. + return new Date(Date.now() + 3000 * 60 * 1000); +}; + +module.exports = { + + async start(context) { + + const expirationDateTime = getSubscriptionExpirationDateTime(); + const { data } = await context.httpRequest({ + url: `${BASE_URL}/subscriptions`, + method: 'POST', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}`, + 'Content-Type': 'application/json', + accept: 'application/json' + }, + data: { + changeType: 'deleted', + notificationUrl: context.getWebhookUrl(), + resource: '/me/events', + expirationDateTime: expirationDateTime.toISOString(), + clientState: CLIENT_STATE + } + }); + + await context.saveState({ subscriptionId: data.id }); + return context.setTimeout({}, expirationDateTime - Date.now() - RENEW_BEFORE_MS); + }, + + async stop(context) { + + const { subscriptionId } = context.state; + if (subscriptionId) { + await context.httpRequest({ + url: `${BASE_URL}/subscriptions/${subscriptionId}`, + method: 'DELETE', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}` + } + }); + } + }, + + async receive(context) { + + if (context.messages.timeout) { + + const { subscriptionId } = context.state; + const expirationDateTime = getSubscriptionExpirationDateTime(); + + await context.httpRequest({ + url: `${BASE_URL}/subscriptions/${subscriptionId}`, + method: 'PATCH', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}`, + 'Content-Type': 'application/json', + accept: 'application/json' + }, + data: { expirationDateTime: expirationDateTime.toISOString() } + }); + + return context.setTimeout({}, expirationDateTime - Date.now() - RENEW_BEFORE_MS); + + } else if (context.messages.webhook) { + + const { data, query } = context.messages.webhook.content; + + if (query.validationToken) { + return context.response(query.validationToken, 200, { 'Content-type': 'text/plain' }); + } + + const value = data.value || []; + for (const notification of value) { + if (notification.clientState === CLIENT_STATE) { + try { + await context.sendJson({ + id: notification.resourceData.id, + changeType: notification.changeType, + resource: notification.resource, + subscriptionId: notification.subscriptionId, + clientState: notification.clientState, + tenantId: notification.tenantId + }, 'out'); + } catch (err) { + // Event may no longer exist (e.g. deleted). Log and continue. + const resId = notification.resourceData?.id; + await context.log({ error: err.message, resId }); + } + } + } + + return context.response('', 200); + } + } +}; diff --git a/src/appmixer/microsoft/calendar/EventDeleted/component.json b/src/appmixer/microsoft/calendar/EventDeleted/component.json new file mode 100644 index 0000000000..62d0bcb172 --- /dev/null +++ b/src/appmixer/microsoft/calendar/EventDeleted/component.json @@ -0,0 +1,55 @@ +{ + "name": "appmixer.microsoft.calendar.EventDeleted", + "author": "AppMixer ", + "label": "Event Deleted", + "description": "Trigger that fires when a calendar event is deleted.", + "private": false, + "version": "1.0.0", + "webhook": true, + "auth": { + "service": "appmixer:microsoft", + "scope": [ + "Calendars.Read" + ] + }, + "quota": { + "manager": "appmixer:microsoft:calendar", + "maxWait": 5000, + "resources": "requests", + "scope": { + "userId": "{{userId}}" + } + }, + "outPorts": [ + { + "name": "out", + "options": [ + { + "label": "Event ID", + "value": "id" + }, + { + "label": "Change Type", + "value": "changeType" + }, + { + "label": "Resource", + "value": "resource" + }, + { + "label": "Subscription ID", + "value": "subscriptionId" + }, + { + "label": "Client State", + "value": "clientState" + }, + { + "label": "Tenant ID", + "value": "tenantId" + } + ] + } + ], + "icon": "data:image/png;base64,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" +} diff --git a/src/appmixer/microsoft/calendar/EventStart/EventStart.js b/src/appmixer/microsoft/calendar/EventStart/EventStart.js new file mode 100644 index 0000000000..1b012ccbe3 --- /dev/null +++ b/src/appmixer/microsoft/calendar/EventStart/EventStart.js @@ -0,0 +1,55 @@ +'use strict'; + +const BASE_URL = 'https://graph.microsoft.com/v1.0'; + +module.exports = { + + async tick(context) { + + const minutesBefore = context.properties.minutesBefore || 0; + + // Look ahead window: check events starting within the next 15 minutes (+ minutesBefore offset). + const now = new Date(); + const startDateTime = new Date(now.getTime() - minutesBefore * 60 * 1000); + const endDateTime = new Date(now.getTime() + 15 * 60 * 1000); + + const { data } = await context.httpRequest({ + url: `${BASE_URL}/me/calendarView`, + method: 'GET', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}`, + accept: 'application/json', + Prefer: 'outlook.timezone="UTC"' + }, + params: { + startDateTime: startDateTime.toISOString(), + endDateTime: endDateTime.toISOString() + } + }); + + const events = data.value || []; + const firedEvents = context.state.firedEvents || {}; + + // Clean up old entries (older than 24h) to prevent state bloat. + const cutoff = Date.now() - 24 * 60 * 60 * 1000; + for (const key of Object.keys(firedEvents)) { + if (firedEvents[key] < cutoff) { + delete firedEvents[key]; + } + } + + for (const event of events) { + if (!firedEvents[event.id]) { + const eventStart = new Date(event.start.dateTime + 'Z'); + const triggerTime = new Date(eventStart.getTime() - minutesBefore * 60 * 1000); + + if (now >= triggerTime) { + firedEvents[event.id] = Date.now(); + await context.sendJson(event, 'out'); + } + } + } + + await context.saveState({ firedEvents }); + } +}; diff --git a/src/appmixer/microsoft/calendar/EventStart/component.json b/src/appmixer/microsoft/calendar/EventStart/component.json new file mode 100644 index 0000000000..91c2b0bd2b --- /dev/null +++ b/src/appmixer/microsoft/calendar/EventStart/component.json @@ -0,0 +1,151 @@ +{ + "name": "appmixer.microsoft.calendar.EventStart", + "author": "AppMixer ", + "label": "Event Start", + "description": "Trigger that fires when a calendar event is about to start.", + "private": false, + "version": "1.0.0", + "tick": true, + "auth": { + "service": "appmixer:microsoft", + "scope": [ + "Calendars.Read" + ] + }, + "quota": { + "manager": "appmixer:microsoft:calendar", + "maxWait": 5000, + "resources": "requests", + "scope": { + "userId": "{{userId}}" + } + }, + "properties": { + "schema": { + "properties": { + "minutesBefore": { + "type": "number" + } + } + }, + "inspector": { + "inputs": { + "minutesBefore": { + "type": "number", + "label": "Minutes Before", + "defaultValue": 0, + "index": 1, + "tooltip": "How many minutes before the event start time to trigger. Default is 0 (triggers at the event start time)." + } + } + } + }, + "outPorts": [ + { + "name": "out", + "options": [ + { + "label": "Event ID", + "value": "id" + }, + { + "label": "Subject", + "value": "subject" + }, + { + "label": "Body Preview", + "value": "bodyPreview" + }, + { + "label": "Body Content", + "value": "body.content" + }, + { + "label": "Body Content Type", + "value": "body.contentType" + }, + { + "label": "Web Link", + "value": "webLink" + }, + { + "label": "Start Date Time", + "value": "start.dateTime" + }, + { + "label": "Start Time Zone", + "value": "start.timeZone" + }, + { + "label": "End Date Time", + "value": "end.dateTime" + }, + { + "label": "End Time Zone", + "value": "end.timeZone" + }, + { + "label": "Location", + "value": "location.displayName" + }, + { + "label": "Organizer Name", + "value": "organizer.emailAddress.name" + }, + { + "label": "Organizer Email", + "value": "organizer.emailAddress.address" + }, + { + "label": "Attendees", + "value": "attendees" + }, + { + "label": "Is All Day", + "value": "isAllDay" + }, + { + "label": "Is Cancelled", + "value": "isCancelled" + }, + { + "label": "Created Date Time", + "value": "createdDateTime" + }, + { + "label": "Last Modified Date Time", + "value": "lastModifiedDateTime" + }, + { + "label": "Categories", + "value": "categories" + }, + { + "label": "Importance", + "value": "importance" + }, + { + "label": "Sensitivity", + "value": "sensitivity" + }, + { + "label": "Show As", + "value": "showAs" + }, + { + "label": "Recurrence", + "value": "recurrence" + }, + { + "label": "Online Meeting URL", + "value": "onlineMeetingUrl" + }, + { + "label": "Online Meeting", + "value": "onlineMeeting" + } + ] + } + ], + "icon": "data:image/png;base64,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" +} diff --git a/src/appmixer/microsoft/calendar/EventUpdated/EventUpdated.js b/src/appmixer/microsoft/calendar/EventUpdated/EventUpdated.js new file mode 100644 index 0000000000..22827b8185 --- /dev/null +++ b/src/appmixer/microsoft/calendar/EventUpdated/EventUpdated.js @@ -0,0 +1,105 @@ +'use strict'; + +const BASE_URL = 'https://graph.microsoft.com/v1.0'; +const CLIENT_STATE = 'appmixer.microsoft.calendar'; +const RENEW_BEFORE_MS = 300000; + +const getSubscriptionExpirationDateTime = () => { + // Max expiration for calendar subscriptions is 4230 minutes (< 3 days). + // Renew every 2 days to stay safe. + return new Date(Date.now() + 3000 * 60 * 1000); +}; + +module.exports = { + + async start(context) { + + const expirationDateTime = getSubscriptionExpirationDateTime(); + const { data } = await context.httpRequest({ + url: `${BASE_URL}/subscriptions`, + method: 'POST', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}`, + 'Content-Type': 'application/json', + accept: 'application/json' + }, + data: { + changeType: 'updated', + notificationUrl: context.getWebhookUrl(), + resource: '/me/events', + expirationDateTime: expirationDateTime.toISOString(), + clientState: CLIENT_STATE + } + }); + + await context.saveState({ subscriptionId: data.id }); + return context.setTimeout({}, expirationDateTime - Date.now() - RENEW_BEFORE_MS); + }, + + async stop(context) { + + const { subscriptionId } = context.state; + if (subscriptionId) { + await context.httpRequest({ + url: `${BASE_URL}/subscriptions/${subscriptionId}`, + method: 'DELETE', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}` + } + }); + } + }, + + async receive(context) { + + if (context.messages.timeout) { + + const { subscriptionId } = context.state; + const expirationDateTime = getSubscriptionExpirationDateTime(); + + await context.httpRequest({ + url: `${BASE_URL}/subscriptions/${subscriptionId}`, + method: 'PATCH', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}`, + 'Content-Type': 'application/json', + accept: 'application/json' + }, + data: { expirationDateTime: expirationDateTime.toISOString() } + }); + + return context.setTimeout({}, expirationDateTime - Date.now() - RENEW_BEFORE_MS); + + } else if (context.messages.webhook) { + + const { data, query } = context.messages.webhook.content; + + if (query.validationToken) { + return context.response(query.validationToken, 200, { 'Content-type': 'text/plain' }); + } + + const value = data.value || []; + for (const notification of value) { + if (notification.clientState === CLIENT_STATE) { + try { + const { data: event } = await context.httpRequest({ + url: `https://graph.microsoft.com/v1.0/me/events/${notification.resourceData.id}`, + method: 'GET', + headers: { + Authorization: `Bearer ${context.auth?.accessToken || context.accessToken}`, + accept: 'application/json' + } + }); + await context.sendJson(event, 'out'); + } catch (err) { + // Event may no longer exist (e.g. deleted). Log and continue. + const resId = notification.resourceData?.id; + await context.log({ error: err.message, resId }); + } + } + } + + return context.response('', 200); + } + } +}; diff --git a/src/appmixer/microsoft/calendar/EventUpdated/component.json b/src/appmixer/microsoft/calendar/EventUpdated/component.json new file mode 100644 index 0000000000..d63976791a --- /dev/null +++ b/src/appmixer/microsoft/calendar/EventUpdated/component.json @@ -0,0 +1,131 @@ +{ + "name": "appmixer.microsoft.calendar.EventUpdated", + "author": "AppMixer ", + "label": "Event Updated", + "description": "Trigger that fires when a calendar event is updated.", + "private": false, + "version": "1.0.0", + "webhook": true, + "auth": { + "service": "appmixer:microsoft", + "scope": [ + "Calendars.Read" + ] + }, + "quota": { + "manager": "appmixer:microsoft:calendar", + "maxWait": 5000, + "resources": "requests", + "scope": { + "userId": "{{userId}}" + } + }, + "outPorts": [ + { + "name": "out", + "options": [ + { + "label": "Event ID", + "value": "id" + }, + { + "label": "Subject", + "value": "subject" + }, + { + "label": "Body Preview", + "value": "bodyPreview" + }, + { + "label": "Body Content", + "value": "body.content" + }, + { + "label": "Body Content Type", + "value": "body.contentType" + }, + { + "label": "Web Link", + "value": "webLink" + }, + { + "label": "Start Date Time", + "value": "start.dateTime" + }, + { + "label": "Start Time Zone", + "value": "start.timeZone" + }, + { + "label": "End Date Time", + "value": "end.dateTime" + }, + { + "label": "End Time Zone", + "value": "end.timeZone" + }, + { + "label": "Location", + "value": "location.displayName" + }, + { + "label": "Organizer Name", + "value": "organizer.emailAddress.name" + }, + { + "label": "Organizer Email", + "value": "organizer.emailAddress.address" + }, + { + "label": "Attendees", + "value": "attendees" + }, + { + "label": "Is All Day", + "value": "isAllDay" + }, + { + "label": "Is Cancelled", + "value": "isCancelled" + }, + { + "label": "Created Date Time", + "value": "createdDateTime" + }, + { + "label": "Last Modified Date Time", + "value": "lastModifiedDateTime" + }, + { + "label": "Categories", + "value": "categories" + }, + { + "label": "Importance", + "value": "importance" + }, + { + "label": "Sensitivity", + "value": "sensitivity" + }, + { + "label": "Show As", + "value": "showAs" + }, + { + "label": "Recurrence", + "value": "recurrence" + }, + { + "label": "Online Meeting URL", + "value": "onlineMeetingUrl" + }, + { + "label": "Online Meeting", + "value": "onlineMeeting" + } + ] + } + ], + "icon": "data:image/png;base64,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" +} diff --git a/src/appmixer/microsoft/calendar/bundle.json b/src/appmixer/microsoft/calendar/bundle.json index 0ab0c26aae..c9e23a4765 100644 --- a/src/appmixer/microsoft/calendar/bundle.json +++ b/src/appmixer/microsoft/calendar/bundle.json @@ -1,11 +1,24 @@ { "name": "appmixer.microsoft.calendar", - "version": "1.0.5", + "version": "1.1.0", "changelog": { - "1.0.1": ["Initial release."], - "1.0.2": ["List Events start and end time filters fixed."], - "1.0.3": ["Fix for possible connection with empty label."], - "1.0.4": ["Connection can now be created with custom tenant. To see the option while creating the connection, in the Admin -> Connector Configuration add configuration 'appmixer:microsoft' and inside it, add item 'microsoftTenant' and set its value to true."], - "1.0.5": ["The authentication flow now displays an account selection screen."] + "1.0.1": [ + "Initial release." + ], + "1.0.2": [ + "List Events start and end time filters fixed." + ], + "1.0.3": [ + "Fix for possible connection with empty label." + ], + "1.0.4": [ + "Connection can now be created with custom tenant. To see the option while creating the connection, in the Admin -> Connector Configuration add configuration 'appmixer:microsoft' and inside it, add item 'microsoftTenant' and set its value to true." + ], + "1.0.5": [ + "The authentication flow now displays an account selection screen." + ], + "1.1.0": [ + "Added EventCreated, EventUpdated, EventDeleted, and EventStart triggers." + ] } }