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

631 lines
23 KiB
TypeScript

import { convertMultiOptionsToStringArray, getCredentialData, getCredentialParam, refreshOAuth2Token } from '../../../src/utils'
import { createGmailTools } from './core'
import type { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
class Gmail_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 = 'Gmail'
this.name = 'gmail'
this.version = 1.0
this.type = 'Gmail'
this.icon = 'gmail.svg'
this.category = 'Tools'
this.description = 'Perform Gmail operations for drafts, messages, labels, and threads'
this.baseClasses = [this.type, 'Tool']
this.credential = {
label: 'Connect Credential',
name: 'credential',
type: 'credential',
credentialNames: ['gmailOAuth2']
}
this.inputs = [
{
label: 'Type',
name: 'gmailType',
type: 'options',
options: [
{
label: 'Drafts',
name: 'drafts'
},
{
label: 'Messages',
name: 'messages'
},
{
label: 'Labels',
name: 'labels'
},
{
label: 'Threads',
name: 'threads'
}
]
},
// Draft Actions
{
label: 'Draft Actions',
name: 'draftActions',
type: 'multiOptions',
options: [
{
label: 'List Drafts',
name: 'listDrafts'
},
{
label: 'Create Draft',
name: 'createDraft'
},
{
label: 'Get Draft',
name: 'getDraft'
},
{
label: 'Update Draft',
name: 'updateDraft'
},
{
label: 'Send Draft',
name: 'sendDraft'
},
{
label: 'Delete Draft',
name: 'deleteDraft'
}
],
show: {
gmailType: ['drafts']
}
},
// Message Actions
{
label: 'Message Actions',
name: 'messageActions',
type: 'multiOptions',
options: [
{
label: 'List Messages',
name: 'listMessages'
},
{
label: 'Get Message',
name: 'getMessage'
},
{
label: 'Send Message',
name: 'sendMessage'
},
{
label: 'Modify Message',
name: 'modifyMessage'
},
{
label: 'Trash Message',
name: 'trashMessage'
},
{
label: 'Untrash Message',
name: 'untrashMessage'
},
{
label: 'Delete Message',
name: 'deleteMessage'
}
],
show: {
gmailType: ['messages']
}
},
// Label Actions
{
label: 'Label Actions',
name: 'labelActions',
type: 'multiOptions',
options: [
{
label: 'List Labels',
name: 'listLabels'
},
{
label: 'Get Label',
name: 'getLabel'
},
{
label: 'Create Label',
name: 'createLabel'
},
{
label: 'Update Label',
name: 'updateLabel'
},
{
label: 'Delete Label',
name: 'deleteLabel'
}
],
show: {
gmailType: ['labels']
}
},
// Thread Actions
{
label: 'Thread Actions',
name: 'threadActions',
type: 'multiOptions',
options: [
{
label: 'List Threads',
name: 'listThreads'
},
{
label: 'Get Thread',
name: 'getThread'
},
{
label: 'Modify Thread',
name: 'modifyThread'
},
{
label: 'Trash Thread',
name: 'trashThread'
},
{
label: 'Untrash Thread',
name: 'untrashThread'
},
{
label: 'Delete Thread',
name: 'deleteThread'
}
],
show: {
gmailType: ['threads']
}
},
// DRAFT PARAMETERS
// List Drafts Parameters
{
label: 'Max Results',
name: 'draftMaxResults',
type: 'number',
description: 'Maximum number of drafts to return',
default: 100,
show: {
draftActions: ['listDrafts']
},
additionalParams: true,
optional: true
},
// Create Draft Parameters
{
label: 'To',
name: 'draftTo',
type: 'string',
description: 'Recipient email address(es), comma-separated',
placeholder: 'user1@example.com,user2@example.com',
show: {
draftActions: ['createDraft']
},
additionalParams: true,
optional: true
},
{
label: 'Subject',
name: 'draftSubject',
type: 'string',
description: 'Email subject',
placeholder: 'Email Subject',
show: {
draftActions: ['createDraft']
},
additionalParams: true,
optional: true
},
{
label: 'Body',
name: 'draftBody',
type: 'string',
description: 'Email body content',
placeholder: 'Email content',
rows: 4,
show: {
draftActions: ['createDraft']
},
additionalParams: true,
optional: true
},
{
label: 'CC',
name: 'draftCc',
type: 'string',
description: 'CC email address(es), comma-separated',
placeholder: 'cc1@example.com,cc2@example.com',
show: {
draftActions: ['createDraft']
},
additionalParams: true,
optional: true
},
{
label: 'BCC',
name: 'draftBcc',
type: 'string',
description: 'BCC email address(es), comma-separated',
placeholder: 'bcc1@example.com,bcc2@example.com',
show: {
draftActions: ['createDraft']
},
additionalParams: true,
optional: true
},
// Draft ID for Get/Update/Send/Delete
{
label: 'Draft ID',
name: 'draftId',
type: 'string',
description: 'ID of the draft',
show: {
draftActions: ['getDraft', 'updateDraft', 'sendDraft', 'deleteDraft']
},
additionalParams: true,
optional: true
},
// Update Draft Parameters
{
label: 'To (Update)',
name: 'draftUpdateTo',
type: 'string',
description: 'Recipient email address(es), comma-separated',
placeholder: 'user1@example.com,user2@example.com',
show: {
draftActions: ['updateDraft']
},
additionalParams: true,
optional: true
},
{
label: 'Subject (Update)',
name: 'draftUpdateSubject',
type: 'string',
description: 'Email subject',
placeholder: 'Email Subject',
show: {
draftActions: ['updateDraft']
},
additionalParams: true,
optional: true
},
{
label: 'Body (Update)',
name: 'draftUpdateBody',
type: 'string',
description: 'Email body content',
placeholder: 'Email content',
rows: 4,
show: {
draftActions: ['updateDraft']
},
additionalParams: true,
optional: true
},
// MESSAGE PARAMETERS
// List Messages Parameters
{
label: 'Max Results',
name: 'messageMaxResults',
type: 'number',
description: 'Maximum number of messages to return',
default: 100,
show: {
messageActions: ['listMessages']
},
additionalParams: true,
optional: true
},
{
label: 'Query',
name: 'messageQuery',
type: 'string',
description: 'Query string for filtering results (Gmail search syntax)',
placeholder: 'is:unread from:example@gmail.com',
show: {
messageActions: ['listMessages']
},
additionalParams: true,
optional: true
},
// Send Message Parameters
{
label: 'To',
name: 'messageTo',
type: 'string',
description: 'Recipient email address(es), comma-separated',
placeholder: 'user1@example.com,user2@example.com',
show: {
messageActions: ['sendMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Subject',
name: 'messageSubject',
type: 'string',
description: 'Email subject',
placeholder: 'Email Subject',
show: {
messageActions: ['sendMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Body',
name: 'messageBody',
type: 'string',
description: 'Email body content',
placeholder: 'Email content',
rows: 4,
show: {
messageActions: ['sendMessage']
},
additionalParams: true,
optional: true
},
{
label: 'CC',
name: 'messageCc',
type: 'string',
description: 'CC email address(es), comma-separated',
placeholder: 'cc1@example.com,cc2@example.com',
show: {
messageActions: ['sendMessage']
},
additionalParams: true,
optional: true
},
{
label: 'BCC',
name: 'messageBcc',
type: 'string',
description: 'BCC email address(es), comma-separated',
placeholder: 'bcc1@example.com,bcc2@example.com',
show: {
messageActions: ['sendMessage']
},
additionalParams: true,
optional: true
},
// Message ID for Get/Modify/Trash/Untrash/Delete
{
label: 'Message ID',
name: 'messageId',
type: 'string',
description: 'ID of the message',
show: {
messageActions: ['getMessage', 'modifyMessage', 'trashMessage', 'untrashMessage', 'deleteMessage']
},
additionalParams: true,
optional: true
},
// Message Label Modification
{
label: 'Add Label IDs',
name: 'messageAddLabelIds',
type: 'string',
description: 'Comma-separated label IDs to add',
placeholder: 'INBOX,STARRED',
show: {
messageActions: ['modifyMessage']
},
additionalParams: true,
optional: true
},
{
label: 'Remove Label IDs',
name: 'messageRemoveLabelIds',
type: 'string',
description: 'Comma-separated label IDs to remove',
placeholder: 'UNREAD,SPAM',
show: {
messageActions: ['modifyMessage']
},
additionalParams: true,
optional: true
},
// LABEL PARAMETERS
// Create Label Parameters
{
label: 'Label Name',
name: 'labelName',
type: 'string',
description: 'Name of the label',
placeholder: 'Important',
show: {
labelActions: ['createLabel', 'updateLabel']
},
additionalParams: true,
optional: true
},
{
label: 'Label Color',
name: 'labelColor',
type: 'string',
description: 'Color of the label (hex color code)',
placeholder: '#ff0000',
show: {
labelActions: ['createLabel', 'updateLabel']
},
additionalParams: true,
optional: true
},
// Label ID for Get/Update/Delete
{
label: 'Label ID',
name: 'labelId',
type: 'string',
description: 'ID of the label',
show: {
labelActions: ['getLabel', 'updateLabel', 'deleteLabel']
},
additionalParams: true,
optional: true
},
// THREAD PARAMETERS
// List Threads Parameters
{
label: 'Max Results',
name: 'threadMaxResults',
type: 'number',
description: 'Maximum number of threads to return',
default: 100,
show: {
threadActions: ['listThreads']
},
additionalParams: true,
optional: true
},
{
label: 'Query',
name: 'threadQuery',
type: 'string',
description: 'Query string for filtering results (Gmail search syntax)',
placeholder: 'is:unread from:example@gmail.com',
show: {
threadActions: ['listThreads']
},
additionalParams: true,
optional: true
},
// Thread ID for Get/Modify/Trash/Untrash/Delete
{
label: 'Thread ID',
name: 'threadId',
type: 'string',
description: 'ID of the thread',
show: {
threadActions: ['getThread', 'modifyThread', 'trashThread', 'untrashThread', 'deleteThread']
},
additionalParams: true,
optional: true
},
// Thread Label Modification
{
label: 'Add Label IDs',
name: 'threadAddLabelIds',
type: 'string',
description: 'Comma-separated label IDs to add',
placeholder: 'INBOX,STARRED',
show: {
threadActions: ['modifyThread']
},
additionalParams: true,
optional: true
},
{
label: 'Remove Label IDs',
name: 'threadRemoveLabelIds',
type: 'string',
description: 'Comma-separated label IDs to remove',
placeholder: 'UNREAD,SPAM',
show: {
threadActions: ['modifyThread']
},
additionalParams: true,
optional: true
}
]
}
async init(nodeData: INodeData, _: string, options: ICommonObject): Promise<any> {
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')
}
// Get all actions based on type
const gmailType = nodeData.inputs?.gmailType as string
let actions: string[] = []
if (gmailType === 'drafts') {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.draftActions)
} else if (gmailType === 'messages') {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.messageActions)
} else if (gmailType === 'labels') {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.labelActions)
} else if (gmailType === 'threads') {
actions = convertMultiOptionsToStringArray(nodeData.inputs?.threadActions)
}
const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
// Create and return tools based on selected actions
const tools = createGmailTools({
actions,
accessToken,
defaultParams
})
return tools
}
transformNodeInputsToToolArgs(nodeData: INodeData): Record<string, any> {
// Collect default parameters from inputs
const defaultParams: Record<string, any> = {}
// Draft parameters
if (nodeData.inputs?.draftMaxResults) defaultParams.draftMaxResults = nodeData.inputs.draftMaxResults
if (nodeData.inputs?.draftTo) defaultParams.draftTo = nodeData.inputs.draftTo
if (nodeData.inputs?.draftSubject) defaultParams.draftSubject = nodeData.inputs.draftSubject
if (nodeData.inputs?.draftBody) defaultParams.draftBody = nodeData.inputs.draftBody
if (nodeData.inputs?.draftCc) defaultParams.draftCc = nodeData.inputs.draftCc
if (nodeData.inputs?.draftBcc) defaultParams.draftBcc = nodeData.inputs.draftBcc
if (nodeData.inputs?.draftId) defaultParams.draftId = nodeData.inputs.draftId
if (nodeData.inputs?.draftUpdateTo) defaultParams.draftUpdateTo = nodeData.inputs.draftUpdateTo
if (nodeData.inputs?.draftUpdateSubject) defaultParams.draftUpdateSubject = nodeData.inputs.draftUpdateSubject
if (nodeData.inputs?.draftUpdateBody) defaultParams.draftUpdateBody = nodeData.inputs.draftUpdateBody
// Message parameters
if (nodeData.inputs?.messageMaxResults) defaultParams.messageMaxResults = nodeData.inputs.messageMaxResults
if (nodeData.inputs?.messageQuery) defaultParams.messageQuery = nodeData.inputs.messageQuery
if (nodeData.inputs?.messageTo) defaultParams.messageTo = nodeData.inputs.messageTo
if (nodeData.inputs?.messageSubject) defaultParams.messageSubject = nodeData.inputs.messageSubject
if (nodeData.inputs?.messageBody) defaultParams.messageBody = nodeData.inputs.messageBody
if (nodeData.inputs?.messageCc) defaultParams.messageCc = nodeData.inputs.messageCc
if (nodeData.inputs?.messageBcc) defaultParams.messageBcc = nodeData.inputs.messageBcc
if (nodeData.inputs?.messageId) defaultParams.messageId = nodeData.inputs.messageId
if (nodeData.inputs?.messageAddLabelIds) defaultParams.messageAddLabelIds = nodeData.inputs.messageAddLabelIds
if (nodeData.inputs?.messageRemoveLabelIds) defaultParams.messageRemoveLabelIds = nodeData.inputs.messageRemoveLabelIds
// Label parameters
if (nodeData.inputs?.labelName) defaultParams.labelName = nodeData.inputs.labelName
if (nodeData.inputs?.labelColor) defaultParams.labelColor = nodeData.inputs.labelColor
if (nodeData.inputs?.labelId) defaultParams.labelId = nodeData.inputs.labelId
// Thread parameters
if (nodeData.inputs?.threadMaxResults) defaultParams.threadMaxResults = nodeData.inputs.threadMaxResults
if (nodeData.inputs?.threadQuery) defaultParams.threadQuery = nodeData.inputs.threadQuery
if (nodeData.inputs?.threadId) defaultParams.threadId = nodeData.inputs.threadId
if (nodeData.inputs?.threadAddLabelIds) defaultParams.threadAddLabelIds = nodeData.inputs.threadAddLabelIds
if (nodeData.inputs?.threadRemoveLabelIds) defaultParams.threadRemoveLabelIds = nodeData.inputs.threadRemoveLabelIds
return defaultParams
}
}
module.exports = { nodeClass: Gmail_Tools }