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

664 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
}
const defaultParams = this.transformNodeInputsToToolArgs(nodeData)
const tools = createGoogleDriveTools({
accessToken,
actions,
defaultParams
})
return tools
}
transformNodeInputsToToolArgs(nodeData: INodeData): Record<string, any> {
// Collect default parameters from inputs
const defaultParams: Record<string, 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
return defaultParams
}
}
module.exports = { nodeClass: GoogleDrive_Tools }