Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions apps/docs/content/docs/en/tools/google_drive.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ Integrate Google Drive into the workflow. Can create, upload, and list files.

### `google_drive_upload`

Upload a file to Google Drive
Upload a file to Google Drive with complete metadata returned

#### Input

Expand All @@ -65,11 +65,11 @@ Upload a file to Google Drive

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `file` | json | Uploaded file metadata including ID, name, and links |
| `file` | object | Complete uploaded file metadata from Google Drive |

### `google_drive_create_folder`

Create a new folder in Google Drive
Create a new folder in Google Drive with complete metadata returned

#### Input

Expand All @@ -83,11 +83,11 @@ Create a new folder in Google Drive

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `file` | json | Created folder metadata including ID, name, and parent information |
| `file` | object | Complete created folder metadata from Google Drive |

### `google_drive_download`

Download a file from Google Drive (exports Google Workspace files automatically)
Download a file from Google Drive with complete metadata (exports Google Workspace files automatically)

#### Input

Expand All @@ -96,16 +96,17 @@ Download a file from Google Drive (exports Google Workspace files automatically)
| `fileId` | string | Yes | The ID of the file to download |
| `mimeType` | string | No | The MIME type to export Google Workspace files to \(optional\) |
| `fileName` | string | No | Optional filename override |
| `includeRevisions` | boolean | No | Whether to include revision history in the metadata \(default: true\) |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `file` | file | Downloaded file stored in execution files |
| `file` | object | Downloaded file stored in execution files |

### `google_drive_list`

List files and folders in Google Drive
List files and folders in Google Drive with complete metadata

#### Input

Expand All @@ -121,7 +122,7 @@ List files and folders in Google Drive

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `files` | json | Array of file metadata objects from the specified folder |
| `files` | array | Array of file metadata objects from Google Drive |



Expand Down
119 changes: 104 additions & 15 deletions apps/sim/tools/google_drive/create_folder.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import { createLogger } from '@sim/logger'
import type { GoogleDriveToolParams, GoogleDriveUploadResponse } from '@/tools/google_drive/types'
import { ALL_FILE_FIELDS } from '@/tools/google_drive/utils'
import type { ToolConfig } from '@/tools/types'

const logger = createLogger('GoogleDriveCreateFolderTool')

export const createFolderTool: ToolConfig<GoogleDriveToolParams, GoogleDriveUploadResponse> = {
id: 'google_drive_create_folder',
name: 'Create Folder in Google Drive',
description: 'Create a new folder in Google Drive',
description: 'Create a new folder in Google Drive with complete metadata returned',
version: '1.0',

oauth: {
Expand Down Expand Up @@ -66,35 +70,120 @@ export const createFolderTool: ToolConfig<GoogleDriveToolParams, GoogleDriveUplo
},
},

transformResponse: async (response: Response) => {
transformResponse: async (response: Response, params?: GoogleDriveToolParams) => {
if (!response.ok) {
const data = await response.json().catch(() => ({}))
logger.error('Failed to create folder in Google Drive', {
status: response.status,
statusText: response.statusText,
error: data,
})
throw new Error(data.error?.message || 'Failed to create folder in Google Drive')
}

const data = await response.json()
const folderId = data.id
const authHeader = `Bearer ${params?.accessToken || ''}`

// Fetch complete folder metadata with all fields
const metadataResponse = await fetch(
`https://www.googleapis.com/drive/v3/files/${folderId}?supportsAllDrives=true&fields=${ALL_FILE_FIELDS}`,
{
headers: {
Authorization: authHeader,
},
}
)

if (!metadataResponse.ok) {
logger.warn('Failed to fetch complete metadata, returning basic response', {
status: metadataResponse.status,
statusText: metadataResponse.statusText,
})
// Return basic response if metadata fetch fails
return {
success: true,
output: {
file: data,
},
}
}

const fullMetadata = await metadataResponse.json()

logger.info('Folder created successfully', {
folderId: fullMetadata.id,
name: fullMetadata.name,
mimeType: fullMetadata.mimeType,
hasOwners: !!fullMetadata.owners?.length,
hasPermissions: !!fullMetadata.permissions?.length,
})

return {
success: true,
output: {
file: {
id: data.id,
name: data.name,
mimeType: data.mimeType,
webViewLink: data.webViewLink,
webContentLink: data.webContentLink,
size: data.size,
createdTime: data.createdTime,
modifiedTime: data.modifiedTime,
parents: data.parents,
},
file: fullMetadata,
},
}
},

outputs: {
file: {
type: 'json',
description: 'Created folder metadata including ID, name, and parent information',
type: 'object',
description: 'Complete created folder metadata from Google Drive',
properties: {
// Basic Info
id: { type: 'string', description: 'Google Drive folder ID' },
name: { type: 'string', description: 'Folder name' },
mimeType: { type: 'string', description: 'MIME type (application/vnd.google-apps.folder)' },
kind: { type: 'string', description: 'Resource type identifier' },
description: { type: 'string', description: 'Folder description' },
// Ownership & Sharing
owners: { type: 'json', description: 'List of folder owners' },
permissions: { type: 'json', description: 'Folder permissions' },
permissionIds: { type: 'json', description: 'Permission IDs' },
shared: { type: 'boolean', description: 'Whether folder is shared' },
ownedByMe: { type: 'boolean', description: 'Whether owned by current user' },
writersCanShare: { type: 'boolean', description: 'Whether writers can share' },
viewersCanCopyContent: { type: 'boolean', description: 'Whether viewers can copy' },
copyRequiresWriterPermission: {
type: 'boolean',
description: 'Whether copy requires writer permission',
},
sharingUser: { type: 'json', description: 'User who shared the folder' },
// Labels/Tags
starred: { type: 'boolean', description: 'Whether folder is starred' },
trashed: { type: 'boolean', description: 'Whether folder is in trash' },
explicitlyTrashed: { type: 'boolean', description: 'Whether explicitly trashed' },
properties: { type: 'json', description: 'Custom properties' },
appProperties: { type: 'json', description: 'App-specific properties' },
folderColorRgb: { type: 'string', description: 'Folder color' },
// Timestamps
createdTime: { type: 'string', description: 'Folder creation time' },
modifiedTime: { type: 'string', description: 'Last modification time' },
modifiedByMeTime: { type: 'string', description: 'When modified by current user' },
viewedByMeTime: { type: 'string', description: 'When last viewed by current user' },
sharedWithMeTime: { type: 'string', description: 'When shared with current user' },
// User Info
lastModifyingUser: { type: 'json', description: 'User who last modified the folder' },
viewedByMe: { type: 'boolean', description: 'Whether viewed by current user' },
modifiedByMe: { type: 'boolean', description: 'Whether modified by current user' },
// Links
webViewLink: { type: 'string', description: 'URL to view in browser' },
iconLink: { type: 'string', description: 'URL to folder icon' },
// Hierarchy & Location
parents: { type: 'json', description: 'Parent folder IDs' },
spaces: { type: 'json', description: 'Spaces containing folder' },
driveId: { type: 'string', description: 'Shared drive ID' },
// Capabilities
capabilities: { type: 'json', description: 'User capabilities on folder' },
// Versions
version: { type: 'string', description: 'Version number' },
// Other
isAppAuthorized: { type: 'boolean', description: 'Whether created by requesting app' },
contentRestrictions: { type: 'json', description: 'Content restrictions' },
linkShareMetadata: { type: 'json', description: 'Link share metadata' },
},
},
},
}
Loading