Files
Flowise/packages/components/nodes/tools/GoogleDrive/GoogleDrive.ts
T
Henry Heng 30c4180d97 Feature/Add teams, gmail, outlook tools (#4577)
* add teams, gmail, outlook tools

* update docs link

* update credentials for oauth2

* add jira tool

* add google drive, google calendar, google sheets tools, powerpoint, excel, word doc loader

* update jira logo

* Refactor Gmail and Outlook tools to remove maxOutputLength parameter and enhance request handling. Update response formatting to include parameters in the output. Adjust Google Drive tools to simplify success messages by removing unnecessary parameter details.
2025-06-06 19:52:04 +01:00

658 lines
23 KiB
TypeScript

import { convertMultiOptionsToStringArray, getCredentialData, getCredentialParam, refreshOAuth2Token } from '../../../src/utils'
import { createGoogleDriveTools } from './core'
import type { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
class GoogleDrive_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 = 'Google Drive'
this.name = 'googleDriveTool'
this.version = 1.0
this.type = 'GoogleDrive'
this.icon = 'google-drive.svg'
this.category = 'Tools'
this.description = 'Perform Google Drive operations such as managing files, folders, sharing, and searching'
this.baseClasses = ['Tool']
this.credential = {
label: 'Connect Credential',
name: 'credential',
type: 'credential',
credentialNames: ['googleDriveOAuth2']
}
this.inputs = [
{
label: 'Type',
name: 'driveType',
type: 'options',
description: 'Type of Google Drive operation',
options: [
{
label: 'File',
name: 'file'
},
{
label: 'Folder',
name: 'folder'
},
{
label: 'Search',
name: 'search'
},
{
label: 'Share',
name: 'share'
}
]
},
// File Actions
{
label: 'File Actions',
name: 'fileActions',
type: 'multiOptions',
description: 'Actions to perform on files',
options: [
{
label: 'List Files',
name: 'listFiles'
},
{
label: 'Get File',
name: 'getFile'
},
{
label: 'Create File',
name: 'createFile'
},
{
label: 'Update File',
name: 'updateFile'
},
{
label: 'Delete File',
name: 'deleteFile'
},
{
label: 'Copy File',
name: 'copyFile'
},
{
label: 'Download File',
name: 'downloadFile'
}
],
show: {
driveType: ['file']
}
},
// Folder Actions
{
label: 'Folder Actions',
name: 'folderActions',
type: 'multiOptions',
description: 'Actions to perform on folders',
options: [
{
label: 'Create Folder',
name: 'createFolder'
},
{
label: 'List Folder Contents',
name: 'listFolderContents'
},
{
label: 'Delete Folder',
name: 'deleteFolder'
}
],
show: {
driveType: ['folder']
}
},
// Search Actions
{
label: 'Search Actions',
name: 'searchActions',
type: 'multiOptions',
description: 'Search operations',
options: [
{
label: 'Search Files',
name: 'searchFiles'
}
],
show: {
driveType: ['search']
}
},
// Share Actions
{
label: 'Share Actions',
name: 'shareActions',
type: 'multiOptions',
description: 'Sharing operations',
options: [
{
label: 'Share File',
name: 'shareFile'
},
{
label: 'Get Permissions',
name: 'getPermissions'
},
{
label: 'Remove Permission',
name: 'removePermission'
}
],
show: {
driveType: ['share']
}
},
// File Parameters
{
label: 'File ID',
name: 'fileId',
type: 'string',
description: 'File ID for file operations',
show: {
fileActions: ['getFile', 'updateFile', 'deleteFile', 'copyFile', 'downloadFile']
},
additionalParams: true,
optional: true
},
{
label: 'File ID',
name: 'fileId',
type: 'string',
description: 'File ID for sharing operations',
show: {
shareActions: ['shareFile', 'getPermissions', 'removePermission']
},
additionalParams: true,
optional: true
},
{
label: 'Folder ID',
name: 'folderId',
type: 'string',
description: 'Folder ID for folder operations',
show: {
folderActions: ['listFolderContents', 'deleteFolder']
},
additionalParams: true,
optional: true
},
{
label: 'Permission ID',
name: 'permissionId',
type: 'string',
description: 'Permission ID to remove',
show: {
shareActions: ['removePermission']
},
additionalParams: true,
optional: true
},
{
label: 'File Name',
name: 'fileName',
type: 'string',
description: 'Name of the file',
show: {
fileActions: ['createFile', 'copyFile']
},
additionalParams: true,
optional: true
},
{
label: 'Folder Name',
name: 'fileName',
type: 'string',
description: 'Name of the folder',
show: {
folderActions: ['createFolder']
},
additionalParams: true,
optional: true
},
{
label: 'File Content',
name: 'fileContent',
type: 'string',
description: 'Content of the file (for text files)',
show: {
fileActions: ['createFile']
},
additionalParams: true,
optional: true
},
{
label: 'MIME Type',
name: 'mimeType',
type: 'string',
description: 'MIME type of the file (e.g., text/plain, application/pdf)',
show: {
fileActions: ['createFile']
},
additionalParams: true,
optional: true
},
{
label: 'Parent Folder ID',
name: 'parentFolderId',
type: 'string',
description: 'ID of the parent folder (comma-separated for multiple parents)',
show: {
fileActions: ['createFile', 'copyFile']
},
additionalParams: true,
optional: true
},
{
label: 'Parent Folder ID',
name: 'parentFolderId',
type: 'string',
description: 'ID of the parent folder for the new folder',
show: {
folderActions: ['createFolder']
},
additionalParams: true,
optional: true
},
{
label: 'File Description',
name: 'description',
type: 'string',
description: 'File description',
show: {
fileActions: ['createFile', 'updateFile']
},
additionalParams: true,
optional: true
},
{
label: 'Folder Description',
name: 'description',
type: 'string',
description: 'Folder description',
show: {
folderActions: ['createFolder']
},
additionalParams: true,
optional: true
},
// Search Parameters
{
label: 'Search Query',
name: 'searchQuery',
type: 'string',
description: 'Search query using Google Drive search syntax',
show: {
searchActions: ['searchFiles']
},
additionalParams: true,
optional: true
},
{
label: 'Max Results',
name: 'maxResults',
type: 'number',
description: 'Maximum number of results to return (1-1000)',
default: 10,
show: {
fileActions: ['listFiles']
},
additionalParams: true,
optional: true
},
{
label: 'Max Results',
name: 'maxResults',
type: 'number',
description: 'Maximum number of results to return (1-1000)',
default: 10,
show: {
searchActions: ['searchFiles']
},
additionalParams: true,
optional: true
},
{
label: 'Order By',
name: 'orderBy',
type: 'options',
description: 'Sort order for file results',
options: [
{
label: 'Name',
name: 'name'
},
{
label: 'Created Time',
name: 'createdTime'
},
{
label: 'Modified Time',
name: 'modifiedTime'
},
{
label: 'Size',
name: 'quotaBytesUsed'
},
{
label: 'Folder',
name: 'folder'
}
],
show: {
fileActions: ['listFiles']
},
additionalParams: true,
optional: true
},
{
label: 'Order By',
name: 'orderBy',
type: 'options',
description: 'Sort order for search results',
options: [
{
label: 'Name',
name: 'name'
},
{
label: 'Created Time',
name: 'createdTime'
},
{
label: 'Modified Time',
name: 'modifiedTime'
},
{
label: 'Size',
name: 'quotaBytesUsed'
},
{
label: 'Folder',
name: 'folder'
}
],
show: {
searchActions: ['searchFiles']
},
additionalParams: true,
optional: true
},
// Share Parameters
{
label: 'Share Role',
name: 'shareRole',
type: 'options',
description: 'Permission role for sharing',
options: [
{
label: 'Reader',
name: 'reader'
},
{
label: 'Writer',
name: 'writer'
},
{
label: 'Commenter',
name: 'commenter'
},
{
label: 'Owner',
name: 'owner'
}
],
show: {
shareActions: ['shareFile']
},
additionalParams: true,
optional: true
},
{
label: 'Share Type',
name: 'shareType',
type: 'options',
description: 'Type of permission',
options: [
{
label: 'User',
name: 'user'
},
{
label: 'Group',
name: 'group'
},
{
label: 'Domain',
name: 'domain'
},
{
label: 'Anyone',
name: 'anyone'
}
],
show: {
shareActions: ['shareFile']
},
additionalParams: true,
optional: true
},
{
label: 'Email Address',
name: 'emailAddress',
type: 'string',
description: 'Email address for user/group sharing',
show: {
shareActions: ['shareFile']
},
additionalParams: true,
optional: true
},
{
label: 'Domain Name',
name: 'domainName',
type: 'string',
description: 'Domain name for domain sharing',
show: {
shareActions: ['shareFile']
},
additionalParams: true,
optional: true
},
{
label: 'Send Notification Email',
name: 'sendNotificationEmail',
type: 'boolean',
description: 'Whether to send notification emails when sharing',
default: true,
show: {
shareActions: ['shareFile']
},
additionalParams: true,
optional: true
},
{
label: 'Email Message',
name: 'emailMessage',
type: 'string',
description: 'Custom message to include in notification email',
show: {
shareActions: ['shareFile']
},
additionalParams: true,
optional: true
},
// Advanced Parameters for File Actions
{
label: 'Include Items From All Drives',
name: 'includeItemsFromAllDrives',
type: 'boolean',
description: 'Include items from all drives (shared drives)',
show: {
fileActions: ['listFiles']
},
additionalParams: true,
optional: true
},
{
label: 'Include Items From All Drives',
name: 'includeItemsFromAllDrives',
type: 'boolean',
description: 'Include items from all drives (shared drives)',
show: {
searchActions: ['searchFiles']
},
additionalParams: true,
optional: true
},
{
label: 'Supports All Drives',
name: 'supportsAllDrives',
type: 'boolean',
description: 'Whether the application supports both My Drives and shared drives',
show: {
fileActions: ['listFiles', 'getFile', 'createFile', 'updateFile', 'deleteFile', 'copyFile', 'downloadFile']
},
additionalParams: true,
optional: true
},
{
label: 'Supports All Drives',
name: 'supportsAllDrives',
type: 'boolean',
description: 'Whether the application supports both My Drives and shared drives',
show: {
folderActions: ['createFolder', 'listFolderContents', 'deleteFolder']
},
additionalParams: true,
optional: true
},
{
label: 'Supports All Drives',
name: 'supportsAllDrives',
type: 'boolean',
description: 'Whether the application supports both My Drives and shared drives',
show: {
searchActions: ['searchFiles']
},
additionalParams: true,
optional: true
},
{
label: 'Supports All Drives',
name: 'supportsAllDrives',
type: 'boolean',
description: 'Whether the application supports both My Drives and shared drives',
show: {
shareActions: ['shareFile', 'getPermissions', 'removePermission']
},
additionalParams: true,
optional: true
},
{
label: 'Fields',
name: 'fields',
type: 'string',
description: 'Specific fields to include in response (e.g., "files(id,name,mimeType)")',
show: {
fileActions: ['listFiles', 'getFile']
},
additionalParams: true,
optional: true
},
{
label: 'Acknowledge Abuse',
name: 'acknowledgeAbuse',
type: 'boolean',
description: 'Acknowledge the risk of downloading known malware or abusive files',
show: {
fileActions: ['getFile', 'downloadFile']
},
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')
}
const driveType = nodeData.inputs?.driveType as string
const fileActions = convertMultiOptionsToStringArray(nodeData.inputs?.fileActions)
const folderActions = convertMultiOptionsToStringArray(nodeData.inputs?.folderActions)
const searchActions = convertMultiOptionsToStringArray(nodeData.inputs?.searchActions)
const shareActions = convertMultiOptionsToStringArray(nodeData.inputs?.shareActions)
// Combine all actions based on type
let actions: string[] = []
if (driveType === 'file') {
actions = fileActions
} else if (driveType === 'folder') {
actions = folderActions
} else if (driveType === 'search') {
actions = searchActions
} else if (driveType === 'share') {
actions = shareActions
}
// Collect default parameters from inputs
const defaultParams: any = {}
// Add parameters based on the inputs provided
if (nodeData.inputs?.fileId) defaultParams.fileId = nodeData.inputs.fileId
if (nodeData.inputs?.folderId) defaultParams.folderId = nodeData.inputs.folderId
if (nodeData.inputs?.permissionId) defaultParams.permissionId = nodeData.inputs.permissionId
if (nodeData.inputs?.fileName) defaultParams.name = nodeData.inputs.fileName
if (nodeData.inputs?.fileContent) defaultParams.content = nodeData.inputs.fileContent
if (nodeData.inputs?.mimeType) defaultParams.mimeType = nodeData.inputs.mimeType
if (nodeData.inputs?.parentFolderId) defaultParams.parents = nodeData.inputs.parentFolderId
if (nodeData.inputs?.description) defaultParams.description = nodeData.inputs.description
if (nodeData.inputs?.searchQuery) defaultParams.query = nodeData.inputs.searchQuery
if (nodeData.inputs?.maxResults) defaultParams.pageSize = nodeData.inputs.maxResults
if (nodeData.inputs?.orderBy) defaultParams.orderBy = nodeData.inputs.orderBy
if (nodeData.inputs?.shareRole) defaultParams.role = nodeData.inputs.shareRole
if (nodeData.inputs?.shareType) defaultParams.type = nodeData.inputs.shareType
if (nodeData.inputs?.emailAddress) defaultParams.emailAddress = nodeData.inputs.emailAddress
if (nodeData.inputs?.domainName) defaultParams.domain = nodeData.inputs.domainName
if (nodeData.inputs?.sendNotificationEmail !== undefined)
defaultParams.sendNotificationEmail = nodeData.inputs.sendNotificationEmail
if (nodeData.inputs?.emailMessage) defaultParams.emailMessage = nodeData.inputs.emailMessage
if (nodeData.inputs?.includeItemsFromAllDrives !== undefined)
defaultParams.includeItemsFromAllDrives = nodeData.inputs.includeItemsFromAllDrives
if (nodeData.inputs?.supportsAllDrives !== undefined) defaultParams.supportsAllDrives = nodeData.inputs.supportsAllDrives
if (nodeData.inputs?.fields) defaultParams.fields = nodeData.inputs.fields
if (nodeData.inputs?.acknowledgeAbuse !== undefined) defaultParams.acknowledgeAbuse = nodeData.inputs.acknowledgeAbuse
const tools = createGoogleDriveTools({
accessToken,
actions,
defaultParams
})
return tools
}
}
module.exports = { nodeClass: GoogleDrive_Tools }