From e2c75a2dafff8fc3b8be0d917a55e3cd88d880f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Tue, 28 Mar 2023 21:28:58 +0300 Subject: [PATCH] feat(google-drive): add new files in folder trigger --- .../apps/google-drive/dynamic-data/index.ts | 3 ++ .../dynamic-data/list-folders/index.ts | 40 +++++++++++++++++++ .../backend/src/apps/google-drive/index.ts | 2 + .../src/apps/google-drive/triggers/index.ts | 3 +- .../triggers/new-files-in-folder/index.ts | 33 +++++++++++++++ .../new-files-in-folder.ts | 29 ++++++++++++++ 6 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/google-drive/dynamic-data/index.ts create mode 100644 packages/backend/src/apps/google-drive/dynamic-data/list-folders/index.ts create mode 100644 packages/backend/src/apps/google-drive/triggers/new-files-in-folder/index.ts create mode 100644 packages/backend/src/apps/google-drive/triggers/new-files-in-folder/new-files-in-folder.ts diff --git a/packages/backend/src/apps/google-drive/dynamic-data/index.ts b/packages/backend/src/apps/google-drive/dynamic-data/index.ts new file mode 100644 index 00000000..033277a5 --- /dev/null +++ b/packages/backend/src/apps/google-drive/dynamic-data/index.ts @@ -0,0 +1,3 @@ +import listFolders from './list-folders'; + +export default [listFolders]; diff --git a/packages/backend/src/apps/google-drive/dynamic-data/list-folders/index.ts b/packages/backend/src/apps/google-drive/dynamic-data/list-folders/index.ts new file mode 100644 index 00000000..e5ffc5c4 --- /dev/null +++ b/packages/backend/src/apps/google-drive/dynamic-data/list-folders/index.ts @@ -0,0 +1,40 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +export default { + name: 'List Folders', + key: 'listFolders', + + async run($: IGlobalVariable) { + const folders: { + data: IJSONObject[]; + } = { + data: [], + }; + + const params = { + q: `mimeType='application/vnd.google-apps.folder'`, + orderBy: 'createdTime desc', + pageToken: undefined as unknown as string, + pageSize: 1000, + }; + + do { + const { data } = await $.http.get( + `https://www.googleapis.com/drive/v3/files`, + { + params, + } + ); + params.pageToken = data.nextPageToken; + + for (const file of data.files) { + folders.data.push({ + value: file.id, + name: file.name, + }); + } + } while (params.pageToken); + + return folders; + }, +}; diff --git a/packages/backend/src/apps/google-drive/index.ts b/packages/backend/src/apps/google-drive/index.ts index d97b8884..be166b40 100644 --- a/packages/backend/src/apps/google-drive/index.ts +++ b/packages/backend/src/apps/google-drive/index.ts @@ -2,6 +2,7 @@ import defineApp from '../../helpers/define-app'; import addAuthHeader from './common/add-auth-header'; import auth from './auth'; import triggers from './triggers'; +import dynamicData from './dynamic-data'; export default defineApp({ name: 'Google Drive', @@ -15,4 +16,5 @@ export default defineApp({ beforeRequest: [addAuthHeader], auth, triggers, + dynamicData, }); diff --git a/packages/backend/src/apps/google-drive/triggers/index.ts b/packages/backend/src/apps/google-drive/triggers/index.ts index a2de71ae..3e0e1eb8 100644 --- a/packages/backend/src/apps/google-drive/triggers/index.ts +++ b/packages/backend/src/apps/google-drive/triggers/index.ts @@ -1,3 +1,4 @@ import newFiles from './new-files'; +import newFilesInFolder from './new-files-in-folder'; -export default [newFiles]; +export default [newFiles, newFilesInFolder]; diff --git a/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/index.ts b/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/index.ts new file mode 100644 index 00000000..3632f970 --- /dev/null +++ b/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/index.ts @@ -0,0 +1,33 @@ +import defineTrigger from '../../../../helpers/define-trigger'; +import newFilesInFolder from './new-files-in-folder'; + +export default defineTrigger({ + name: 'New Files in Folder', + key: 'newFilesInFolder', + pollInterval: 15, + description: + 'Triggers when a new file is added directly to a specific folder (but not its subfolder).', + arguments: [ + { + label: 'Folder', + key: 'folderId', + type: 'dropdown' as const, + required: true, + variables: false, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listFolders', + }, + ], + }, + }, + ], + + async run($) { + await newFilesInFolder($); + }, +}); diff --git a/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/new-files-in-folder.ts b/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/new-files-in-folder.ts new file mode 100644 index 00000000..577efbee --- /dev/null +++ b/packages/backend/src/apps/google-drive/triggers/new-files-in-folder/new-files-in-folder.ts @@ -0,0 +1,29 @@ +import { IGlobalVariable } from '@automatisch/types'; + +const newFilesInFolder = async ($: IGlobalVariable) => { + const params = { + pageToken: undefined as unknown as string, + orderBy: 'createdTime desc', + q: `'${$.step.parameters.folderId}' in parents`, + fields: '*', + pageSize: 1000, + }; + + do { + const { data } = await $.http.get(`/v3/files`, { params }); + params.pageToken = data.nextPageToken; + + if (data.files?.length) { + for (const file of data.files) { + $.pushTriggerItem({ + raw: file, + meta: { + internalId: file.id, + }, + }); + } + } + } while (params.pageToken); +}; + +export default newFilesInFolder;