import { convertMultiOptionsToStringArray, getCredentialData, getCredentialParam, refreshOAuth2Token } from '../../../src/utils' import { createOutlookTools } from './core' import type { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' class MicrosoftOutlook_Tools implements INode { label: string name: string version: number type: string icon: string category: string description: string baseClasses: string[] credential: INodeParams inputs: INodeParams[] constructor() { this.label = 'Microsoft Outlook' this.name = 'microsoftOutlook' this.version = 1.0 this.type = 'MicrosoftOutlook' this.icon = 'outlook.svg' this.category = 'Tools' this.description = 'Perform Microsoft Outlook operations for calendars, events, and messages' this.baseClasses = [this.type, 'Tool'] this.credential = { label: 'Connect Credential', name: 'credential', type: 'credential', credentialNames: ['microsoftOutlookOAuth2'] } this.inputs = [ { label: 'Type', name: 'outlookType', type: 'options', options: [ { label: 'Calendar', name: 'calendar' }, { label: 'Message', name: 'message' } ] }, // Calendar Actions { label: 'Calendar Actions', name: 'calendarActions', type: 'multiOptions', options: [ { label: 'List Calendars', name: 'listCalendars' }, { label: 'Get Calendar', name: 'getCalendar' }, { label: 'Create Calendar', name: 'createCalendar' }, { label: 'Update Calendar', name: 'updateCalendar' }, { label: 'Delete Calendar', name: 'deleteCalendar' }, { label: 'List Events', name: 'listEvents' }, { label: 'Get Event', name: 'getEvent' }, { label: 'Create Event', name: 'createEvent' }, { label: 'Update Event', name: 'updateEvent' }, { label: 'Delete Event', name: 'deleteEvent' } ], show: { outlookType: ['calendar'] } }, // Message Actions { label: 'Message Actions', name: 'messageActions', type: 'multiOptions', options: [ { label: 'List Messages', name: 'listMessages' }, { label: 'Get Message', name: 'getMessage' }, { label: 'Create Draft Message', name: 'createDraftMessage' }, { label: 'Send Message', name: 'sendMessage' }, { label: 'Update Message', name: 'updateMessage' }, { label: 'Delete Message', name: 'deleteMessage' }, { label: 'Copy Message', name: 'copyMessage' }, { label: 'Move Message', name: 'moveMessage' }, { label: 'Reply to Message', name: 'replyMessage' }, { label: 'Forward Message', name: 'forwardMessage' } ], show: { outlookType: ['message'] } }, // CALENDAR PARAMETERS // List Calendars Parameters { label: 'Max Results [List Calendars]', name: 'maxResultsListCalendars', type: 'number', description: 'Maximum number of calendars to return', default: 50, show: { outlookType: ['calendar'], calendarActions: ['listCalendars'] }, additionalParams: true, optional: true }, // Get Calendar Parameters { label: 'Calendar ID [Get Calendar]', name: 'calendarIdGetCalendar', type: 'string', description: 'ID of the calendar to retrieve', show: { outlookType: ['calendar'], calendarActions: ['getCalendar'] }, additionalParams: true, optional: true }, // Create Calendar Parameters { label: 'Calendar Name [Create Calendar]', name: 'calendarNameCreateCalendar', type: 'string', description: 'Name of the calendar', placeholder: 'My New Calendar', show: { outlookType: ['calendar'], calendarActions: ['createCalendar'] }, additionalParams: true, optional: true }, // Update Calendar Parameters { label: 'Calendar ID [Update Calendar]', name: 'calendarIdUpdateCalendar', type: 'string', description: 'ID of the calendar to update', show: { outlookType: ['calendar'], calendarActions: ['updateCalendar'] }, additionalParams: true, optional: true }, { label: 'Calendar Name [Update Calendar]', name: 'calendarNameUpdateCalendar', type: 'string', description: 'New name of the calendar', show: { outlookType: ['calendar'], calendarActions: ['updateCalendar'] }, additionalParams: true, optional: true }, // Delete Calendar Parameters { label: 'Calendar ID [Delete Calendar]', name: 'calendarIdDeleteCalendar', type: 'string', description: 'ID of the calendar to delete', show: { outlookType: ['calendar'], calendarActions: ['deleteCalendar'] }, additionalParams: true, optional: true }, // List Events Parameters { label: 'Calendar ID [List Events]', name: 'calendarIdListEvents', type: 'string', description: 'ID of the calendar (leave empty for primary calendar)', show: { outlookType: ['calendar'], calendarActions: ['listEvents'] }, additionalParams: true, optional: true }, { label: 'Max Results [List Events]', name: 'maxResultsListEvents', type: 'number', description: 'Maximum number of events to return', default: 50, show: { outlookType: ['calendar'], calendarActions: ['listEvents'] }, additionalParams: true, optional: true }, { label: 'Start Date Time [List Events]', name: 'startDateTimeListEvents', type: 'string', description: 'Start date time filter in ISO format', placeholder: '2024-01-01T00:00:00Z', show: { outlookType: ['calendar'], calendarActions: ['listEvents'] }, additionalParams: true, optional: true }, { label: 'End Date Time [List Events]', name: 'endDateTimeListEvents', type: 'string', description: 'End date time filter in ISO format', placeholder: '2024-12-31T23:59:59Z', show: { outlookType: ['calendar'], calendarActions: ['listEvents'] }, additionalParams: true, optional: true }, // Get Event Parameters { label: 'Event ID [Get Event]', name: 'eventIdGetEvent', type: 'string', description: 'ID of the event to retrieve', show: { outlookType: ['calendar'], calendarActions: ['getEvent'] }, additionalParams: true, optional: true }, // Create Event Parameters { label: 'Subject [Create Event]', name: 'subjectCreateEvent', type: 'string', description: 'Subject/title of the event', placeholder: 'Meeting Title', show: { outlookType: ['calendar'], calendarActions: ['createEvent'] }, additionalParams: true, optional: true }, { label: 'Body [Create Event]', name: 'bodyCreateEvent', type: 'string', description: 'Body/description of the event', placeholder: 'Meeting description', rows: 3, show: { outlookType: ['calendar'], calendarActions: ['createEvent'] }, additionalParams: true, optional: true }, { label: 'Start Date Time [Create Event]', name: 'startDateTimeCreateEvent', type: 'string', description: 'Start date and time in ISO format', placeholder: '2024-01-15T10:00:00', show: { outlookType: ['calendar'], calendarActions: ['createEvent'] }, additionalParams: true, optional: true }, { label: 'End Date Time [Create Event]', name: 'endDateTimeCreateEvent', type: 'string', description: 'End date and time in ISO format', placeholder: '2024-01-15T11:00:00', show: { outlookType: ['calendar'], calendarActions: ['createEvent'] }, additionalParams: true, optional: true }, { label: 'Time Zone [Create Event]', name: 'timeZoneCreateEvent', type: 'string', description: 'Time zone for the event', placeholder: 'UTC', default: 'UTC', show: { outlookType: ['calendar'], calendarActions: ['createEvent'] }, additionalParams: true, optional: true }, { label: 'Location [Create Event]', name: 'locationCreateEvent', type: 'string', description: 'Location of the event', placeholder: 'Conference Room A', show: { outlookType: ['calendar'], calendarActions: ['createEvent'] }, additionalParams: true, optional: true }, { label: 'Attendees [Create Event]', name: 'attendeesCreateEvent', type: 'string', description: 'Comma-separated list of attendee email addresses', placeholder: 'user1@example.com,user2@example.com', show: { outlookType: ['calendar'], calendarActions: ['createEvent'] }, additionalParams: true, optional: true }, // Update Event Parameters { label: 'Event ID [Update Event]', name: 'eventIdUpdateEvent', type: 'string', description: 'ID of the event to update', show: { outlookType: ['calendar'], calendarActions: ['updateEvent'] }, additionalParams: true, optional: true }, { label: 'Subject [Update Event]', name: 'subjectUpdateEvent', type: 'string', description: 'New subject/title of the event', show: { outlookType: ['calendar'], calendarActions: ['updateEvent'] }, additionalParams: true, optional: true }, // Delete Event Parameters { label: 'Event ID [Delete Event]', name: 'eventIdDeleteEvent', type: 'string', description: 'ID of the event to delete', show: { outlookType: ['calendar'], calendarActions: ['deleteEvent'] }, additionalParams: true, optional: true }, // MESSAGE PARAMETERS // List Messages Parameters { label: 'Max Results [List Messages]', name: 'maxResultsListMessages', type: 'number', description: 'Maximum number of messages to return', default: 50, show: { outlookType: ['message'], messageActions: ['listMessages'] }, additionalParams: true, optional: true }, { label: 'Filter [List Messages]', name: 'filterListMessages', type: 'string', description: 'Filter query (e.g., "isRead eq false")', show: { outlookType: ['message'], messageActions: ['listMessages'] }, additionalParams: true, optional: true }, // Get Message Parameters { label: 'Message ID [Get Message]', name: 'messageIdGetMessage', type: 'string', description: 'ID of the message to retrieve', show: { outlookType: ['message'], messageActions: ['getMessage'] }, additionalParams: true, optional: true }, // Create Draft Message Parameters { label: 'To [Create Draft Message]', name: 'toCreateDraftMessage', type: 'string', description: 'Recipient email address(es), comma-separated', placeholder: 'user@example.com', show: { outlookType: ['message'], messageActions: ['createDraftMessage'] }, additionalParams: true, optional: true }, { label: 'Subject [Create Draft Message]', name: 'subjectCreateDraftMessage', type: 'string', description: 'Subject of the message', placeholder: 'Email Subject', show: { outlookType: ['message'], messageActions: ['createDraftMessage'] }, additionalParams: true, optional: true }, { label: 'Body [Create Draft Message]', name: 'bodyCreateDraftMessage', type: 'string', description: 'Body content of the message', placeholder: 'Email body content', rows: 4, show: { outlookType: ['message'], messageActions: ['createDraftMessage'] }, additionalParams: true, optional: true }, { label: 'CC [Create Draft Message]', name: 'ccCreateDraftMessage', type: 'string', description: 'CC email address(es), comma-separated', placeholder: 'cc@example.com', show: { outlookType: ['message'], messageActions: ['createDraftMessage'] }, additionalParams: true, optional: true }, { label: 'BCC [Create Draft Message]', name: 'bccCreateDraftMessage', type: 'string', description: 'BCC email address(es), comma-separated', placeholder: 'bcc@example.com', show: { outlookType: ['message'], messageActions: ['createDraftMessage'] }, additionalParams: true, optional: true }, // Send Message Parameters { label: 'To [Send Message]', name: 'toSendMessage', type: 'string', description: 'Recipient email address(es), comma-separated', placeholder: 'user@example.com', show: { outlookType: ['message'], messageActions: ['sendMessage'] }, additionalParams: true, optional: true }, { label: 'Subject [Send Message]', name: 'subjectSendMessage', type: 'string', description: 'Subject of the message', placeholder: 'Email Subject', show: { outlookType: ['message'], messageActions: ['sendMessage'] }, additionalParams: true, optional: true }, { label: 'Body [Send Message]', name: 'bodySendMessage', type: 'string', description: 'Body content of the message', placeholder: 'Email body content', rows: 4, show: { outlookType: ['message'], messageActions: ['sendMessage'] }, additionalParams: true, optional: true }, // Update Message Parameters { label: 'Message ID [Update Message]', name: 'messageIdUpdateMessage', type: 'string', description: 'ID of the message to update', show: { outlookType: ['message'], messageActions: ['updateMessage'] }, additionalParams: true, optional: true }, { label: 'Is Read [Update Message]', name: 'isReadUpdateMessage', type: 'boolean', description: 'Mark message as read/unread', show: { outlookType: ['message'], messageActions: ['updateMessage'] }, additionalParams: true, optional: true }, // Delete Message Parameters { label: 'Message ID [Delete Message]', name: 'messageIdDeleteMessage', type: 'string', description: 'ID of the message to delete', show: { outlookType: ['message'], messageActions: ['deleteMessage'] }, additionalParams: true, optional: true }, // Copy Message Parameters { label: 'Message ID [Copy Message]', name: 'messageIdCopyMessage', type: 'string', description: 'ID of the message to copy', show: { outlookType: ['message'], messageActions: ['copyMessage'] }, additionalParams: true, optional: true }, { label: 'Destination Folder ID [Copy Message]', name: 'destinationFolderIdCopyMessage', type: 'string', description: 'ID of the destination folder', show: { outlookType: ['message'], messageActions: ['copyMessage'] }, additionalParams: true, optional: true }, // Move Message Parameters { label: 'Message ID [Move Message]', name: 'messageIdMoveMessage', type: 'string', description: 'ID of the message to move', show: { outlookType: ['message'], messageActions: ['moveMessage'] }, additionalParams: true, optional: true }, { label: 'Destination Folder ID [Move Message]', name: 'destinationFolderIdMoveMessage', type: 'string', description: 'ID of the destination folder', show: { outlookType: ['message'], messageActions: ['moveMessage'] }, additionalParams: true, optional: true }, // Reply Message Parameters { label: 'Message ID [Reply Message]', name: 'messageIdReplyMessage', type: 'string', description: 'ID of the message to reply to', show: { outlookType: ['message'], messageActions: ['replyMessage'] }, additionalParams: true, optional: true }, { label: 'Reply Body [Reply Message]', name: 'replyBodyReplyMessage', type: 'string', description: 'Reply message body', rows: 4, show: { outlookType: ['message'], messageActions: ['replyMessage'] }, additionalParams: true, optional: true }, // Forward Message Parameters { label: 'Message ID [Forward Message]', name: 'messageIdForwardMessage', type: 'string', description: 'ID of the message to forward', show: { outlookType: ['message'], messageActions: ['forwardMessage'] }, additionalParams: true, optional: true }, { label: 'Forward To [Forward Message]', name: 'forwardToForwardMessage', type: 'string', description: 'Email address(es) to forward to, comma-separated', show: { outlookType: ['message'], messageActions: ['forwardMessage'] }, additionalParams: true, optional: true }, { label: 'Forward Comment [Forward Message]', name: 'forwardCommentForwardMessage', type: 'string', description: 'Additional comment to include with forward', rows: 2, show: { outlookType: ['message'], messageActions: ['forwardMessage'] }, additionalParams: true, optional: true } ] } async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const outlookType = nodeData.inputs?.outlookType as string const calendarActions = nodeData.inputs?.calendarActions as string const messageActions = nodeData.inputs?.messageActions as string let credentialData = await getCredentialData(nodeData.credential ?? '', options) credentialData = await refreshOAuth2Token(nodeData.credential ?? '', credentialData, options) const accessToken = getCredentialParam('access_token', credentialData, nodeData) if (!accessToken) { throw new Error('No access token found in credential') } let actions: string[] = [] if (outlookType === 'calendar') { actions = convertMultiOptionsToStringArray(calendarActions) } else if (outlookType === 'message') { actions = convertMultiOptionsToStringArray(messageActions) } const defaultParams = this.transformNodeInputsToToolArgs(nodeData) const outlookTools = createOutlookTools({ accessToken, actions, defaultParams }) return outlookTools } transformNodeInputsToToolArgs(nodeData: INodeData): Record { // Collect default parameters from inputs const defaultParams: Record = {} // Calendar parameters if (nodeData.inputs?.maxResultsListCalendars) defaultParams.maxResultsListCalendars = nodeData.inputs.maxResultsListCalendars if (nodeData.inputs?.calendarIdGetCalendar) defaultParams.calendarIdGetCalendar = nodeData.inputs.calendarIdGetCalendar if (nodeData.inputs?.calendarNameCreateCalendar) defaultParams.calendarNameCreateCalendar = nodeData.inputs.calendarNameCreateCalendar if (nodeData.inputs?.calendarIdUpdateCalendar) defaultParams.calendarIdUpdateCalendar = nodeData.inputs.calendarIdUpdateCalendar if (nodeData.inputs?.calendarNameUpdateCalendar) defaultParams.calendarNameUpdateCalendar = nodeData.inputs.calendarNameUpdateCalendar if (nodeData.inputs?.calendarIdDeleteCalendar) defaultParams.calendarIdDeleteCalendar = nodeData.inputs.calendarIdDeleteCalendar if (nodeData.inputs?.calendarIdListEvents) defaultParams.calendarIdListEvents = nodeData.inputs.calendarIdListEvents if (nodeData.inputs?.maxResultsListEvents) defaultParams.maxResultsListEvents = nodeData.inputs.maxResultsListEvents if (nodeData.inputs?.startDateTimeListEvents) defaultParams.startDateTimeListEvents = nodeData.inputs.startDateTimeListEvents if (nodeData.inputs?.endDateTimeListEvents) defaultParams.endDateTimeListEvents = nodeData.inputs.endDateTimeListEvents if (nodeData.inputs?.eventIdGetEvent) defaultParams.eventIdGetEvent = nodeData.inputs.eventIdGetEvent if (nodeData.inputs?.subjectCreateEvent) defaultParams.subjectCreateEvent = nodeData.inputs.subjectCreateEvent if (nodeData.inputs?.bodyCreateEvent) defaultParams.bodyCreateEvent = nodeData.inputs.bodyCreateEvent if (nodeData.inputs?.startDateTimeCreateEvent) defaultParams.startDateTimeCreateEvent = nodeData.inputs.startDateTimeCreateEvent if (nodeData.inputs?.endDateTimeCreateEvent) defaultParams.endDateTimeCreateEvent = nodeData.inputs.endDateTimeCreateEvent if (nodeData.inputs?.timeZoneCreateEvent) defaultParams.timeZoneCreateEvent = nodeData.inputs.timeZoneCreateEvent if (nodeData.inputs?.locationCreateEvent) defaultParams.locationCreateEvent = nodeData.inputs.locationCreateEvent if (nodeData.inputs?.attendeesCreateEvent) defaultParams.attendeesCreateEvent = nodeData.inputs.attendeesCreateEvent if (nodeData.inputs?.eventIdUpdateEvent) defaultParams.eventIdUpdateEvent = nodeData.inputs.eventIdUpdateEvent if (nodeData.inputs?.subjectUpdateEvent) defaultParams.subjectUpdateEvent = nodeData.inputs.subjectUpdateEvent if (nodeData.inputs?.eventIdDeleteEvent) defaultParams.eventIdDeleteEvent = nodeData.inputs.eventIdDeleteEvent // Message parameters if (nodeData.inputs?.maxResultsListMessages) defaultParams.maxResultsListMessages = nodeData.inputs.maxResultsListMessages if (nodeData.inputs?.filterListMessages) defaultParams.filterListMessages = nodeData.inputs.filterListMessages if (nodeData.inputs?.messageIdGetMessage) defaultParams.messageIdGetMessage = nodeData.inputs.messageIdGetMessage if (nodeData.inputs?.toCreateDraftMessage) defaultParams.toCreateDraftMessage = nodeData.inputs.toCreateDraftMessage if (nodeData.inputs?.subjectCreateDraftMessage) defaultParams.subjectCreateDraftMessage = nodeData.inputs.subjectCreateDraftMessage if (nodeData.inputs?.bodyCreateDraftMessage) defaultParams.bodyCreateDraftMessage = nodeData.inputs.bodyCreateDraftMessage if (nodeData.inputs?.ccCreateDraftMessage) defaultParams.ccCreateDraftMessage = nodeData.inputs.ccCreateDraftMessage if (nodeData.inputs?.bccCreateDraftMessage) defaultParams.bccCreateDraftMessage = nodeData.inputs.bccCreateDraftMessage if (nodeData.inputs?.toSendMessage) defaultParams.toSendMessage = nodeData.inputs.toSendMessage if (nodeData.inputs?.subjectSendMessage) defaultParams.subjectSendMessage = nodeData.inputs.subjectSendMessage if (nodeData.inputs?.bodySendMessage) defaultParams.bodySendMessage = nodeData.inputs.bodySendMessage if (nodeData.inputs?.messageIdUpdateMessage) defaultParams.messageIdUpdateMessage = nodeData.inputs.messageIdUpdateMessage if (nodeData.inputs?.isReadUpdateMessage !== undefined) defaultParams.isReadUpdateMessage = nodeData.inputs.isReadUpdateMessage if (nodeData.inputs?.messageIdDeleteMessage) defaultParams.messageIdDeleteMessage = nodeData.inputs.messageIdDeleteMessage if (nodeData.inputs?.messageIdCopyMessage) defaultParams.messageIdCopyMessage = nodeData.inputs.messageIdCopyMessage if (nodeData.inputs?.destinationFolderIdCopyMessage) defaultParams.destinationFolderIdCopyMessage = nodeData.inputs.destinationFolderIdCopyMessage if (nodeData.inputs?.messageIdMoveMessage) defaultParams.messageIdMoveMessage = nodeData.inputs.messageIdMoveMessage if (nodeData.inputs?.destinationFolderIdMoveMessage) defaultParams.destinationFolderIdMoveMessage = nodeData.inputs.destinationFolderIdMoveMessage if (nodeData.inputs?.messageIdReplyMessage) defaultParams.messageIdReplyMessage = nodeData.inputs.messageIdReplyMessage if (nodeData.inputs?.replyBodyReplyMessage) defaultParams.replyBodyReplyMessage = nodeData.inputs.replyBodyReplyMessage if (nodeData.inputs?.messageIdForwardMessage) defaultParams.messageIdForwardMessage = nodeData.inputs.messageIdForwardMessage if (nodeData.inputs?.forwardToForwardMessage) defaultParams.forwardToForwardMessage = nodeData.inputs.forwardToForwardMessage if (nodeData.inputs?.forwardCommentForwardMessage) defaultParams.forwardCommentForwardMessage = nodeData.inputs.forwardCommentForwardMessage return defaultParams } } module.exports = { nodeClass: MicrosoftOutlook_Tools }