Flowise/packages/components/nodes/tools/MicrosoftOutlook/MicrosoftOutlook.ts

823 lines
33 KiB
TypeScript

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<any> {
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<string, any> {
// Collect default parameters from inputs
const defaultParams: Record<string, any> = {}
// 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 }