diff --git a/packages/backend/src/apps/google-sheet/assets/favicon.svg b/packages/backend/src/apps/google-sheets/assets/favicon.svg similarity index 100% rename from packages/backend/src/apps/google-sheet/assets/favicon.svg rename to packages/backend/src/apps/google-sheets/assets/favicon.svg diff --git a/packages/backend/src/apps/google-sheet/auth/generate-auth-url.ts b/packages/backend/src/apps/google-sheets/auth/generate-auth-url.ts similarity index 100% rename from packages/backend/src/apps/google-sheet/auth/generate-auth-url.ts rename to packages/backend/src/apps/google-sheets/auth/generate-auth-url.ts diff --git a/packages/backend/src/apps/google-sheet/auth/index.ts b/packages/backend/src/apps/google-sheets/auth/index.ts similarity index 94% rename from packages/backend/src/apps/google-sheet/auth/index.ts rename to packages/backend/src/apps/google-sheets/auth/index.ts index 68b86767..5e52e35a 100644 --- a/packages/backend/src/apps/google-sheet/auth/index.ts +++ b/packages/backend/src/apps/google-sheets/auth/index.ts @@ -11,7 +11,7 @@ export default { type: 'string' as const, required: true, readOnly: true, - value: '{WEB_APP_URL}/app/google-sheet/connections/add', + value: '{WEB_APP_URL}/app/google-sheets/connections/add', placeholder: null, description: 'When asked to input a redirect URL in Google Cloud, enter the URL above.', diff --git a/packages/backend/src/apps/google-sheet/auth/is-still-verified.ts b/packages/backend/src/apps/google-sheets/auth/is-still-verified.ts similarity index 100% rename from packages/backend/src/apps/google-sheet/auth/is-still-verified.ts rename to packages/backend/src/apps/google-sheets/auth/is-still-verified.ts diff --git a/packages/backend/src/apps/google-sheet/auth/refresh-token.ts b/packages/backend/src/apps/google-sheets/auth/refresh-token.ts similarity index 100% rename from packages/backend/src/apps/google-sheet/auth/refresh-token.ts rename to packages/backend/src/apps/google-sheets/auth/refresh-token.ts diff --git a/packages/backend/src/apps/google-sheet/auth/verify-credentials.ts b/packages/backend/src/apps/google-sheets/auth/verify-credentials.ts similarity index 100% rename from packages/backend/src/apps/google-sheet/auth/verify-credentials.ts rename to packages/backend/src/apps/google-sheets/auth/verify-credentials.ts diff --git a/packages/backend/src/apps/google-sheet/common/add-auth-header.ts b/packages/backend/src/apps/google-sheets/common/add-auth-header.ts similarity index 100% rename from packages/backend/src/apps/google-sheet/common/add-auth-header.ts rename to packages/backend/src/apps/google-sheets/common/add-auth-header.ts diff --git a/packages/backend/src/apps/google-sheet/common/auth-scope.ts b/packages/backend/src/apps/google-sheets/common/auth-scope.ts similarity index 100% rename from packages/backend/src/apps/google-sheet/common/auth-scope.ts rename to packages/backend/src/apps/google-sheets/common/auth-scope.ts diff --git a/packages/backend/src/apps/google-sheet/common/get-current-user.ts b/packages/backend/src/apps/google-sheets/common/get-current-user.ts similarity index 100% rename from packages/backend/src/apps/google-sheet/common/get-current-user.ts rename to packages/backend/src/apps/google-sheets/common/get-current-user.ts diff --git a/packages/backend/src/apps/google-sheets/dynamic-data/index.ts b/packages/backend/src/apps/google-sheets/dynamic-data/index.ts new file mode 100644 index 00000000..f570d9a5 --- /dev/null +++ b/packages/backend/src/apps/google-sheets/dynamic-data/index.ts @@ -0,0 +1,3 @@ +import listDrives from './list-drives'; + +export default [listDrives]; \ No newline at end of file diff --git a/packages/backend/src/apps/google-sheets/dynamic-data/list-drives/index.ts b/packages/backend/src/apps/google-sheets/dynamic-data/list-drives/index.ts new file mode 100644 index 00000000..ea68c599 --- /dev/null +++ b/packages/backend/src/apps/google-sheets/dynamic-data/list-drives/index.ts @@ -0,0 +1,38 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +export default { + name: 'List drives', + key: 'listDrives', + + async run($: IGlobalVariable) { + const drives: { + data: IJSONObject[]; + } = { + data: [{ value: null, name: 'My Google Drive' }], + }; + + const params = { + pageSize: 100, + pageToken: undefined as unknown as string, + }; + + do { + const { data } = await $.http.get( + `https://www.googleapis.com/drive/v3/drives`, + { params } + ); + params.pageToken = data.nextPageToken; + + if (data.drives) { + for (const drive of data.drives) { + drives.data.push({ + value: drive.id, + name: drive.name, + }); + } + } + } while (params.pageToken); + + return drives; + }, +}; diff --git a/packages/backend/src/apps/google-sheet/index.d.ts b/packages/backend/src/apps/google-sheets/index.d.ts similarity index 100% rename from packages/backend/src/apps/google-sheet/index.d.ts rename to packages/backend/src/apps/google-sheets/index.d.ts diff --git a/packages/backend/src/apps/google-sheet/index.ts b/packages/backend/src/apps/google-sheets/index.ts similarity index 55% rename from packages/backend/src/apps/google-sheet/index.ts rename to packages/backend/src/apps/google-sheets/index.ts index 80684fee..5232b5f6 100644 --- a/packages/backend/src/apps/google-sheet/index.ts +++ b/packages/backend/src/apps/google-sheets/index.ts @@ -1,16 +1,20 @@ 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 Sheet', - key: 'google-sheet', + name: 'Google Sheets', + key: 'google-sheets', baseUrl: 'https://docs.google.com/spreadsheets', apiBaseUrl: 'https://sheets.googleapis.com', - iconUrl: '{BASE_URL}/apps/google-sheet/assets/favicon.svg', - authDocUrl: 'https://automatisch.io/docs/apps/google-sheet/connection', + iconUrl: '{BASE_URL}/apps/google-sheets/assets/favicon.svg', + authDocUrl: 'https://automatisch.io/docs/apps/google-sheets/connection', primaryColor: '0F9D58', supportsConnections: true, beforeRequest: [addAuthHeader], auth, + triggers, + dynamicData, }); diff --git a/packages/backend/src/apps/google-sheets/triggers/index.ts b/packages/backend/src/apps/google-sheets/triggers/index.ts new file mode 100644 index 00000000..c2c22ebe --- /dev/null +++ b/packages/backend/src/apps/google-sheets/triggers/index.ts @@ -0,0 +1,3 @@ +import newSpreadsheets from './new-spreadsheets'; + +export default [newSpreadsheets]; \ No newline at end of file diff --git a/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/index.ts b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/index.ts new file mode 100644 index 00000000..afb08a3c --- /dev/null +++ b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/index.ts @@ -0,0 +1,33 @@ +import defineTrigger from '../../../../helpers/define-trigger'; +import newSpreadsheets from './new-spreadsheets' + +export default defineTrigger({ + name: 'New Spreadsheets', + key: 'newSpreadsheets', + pollInterval: 15, + description: 'Triggers when you create a new spreadsheet.', + arguments: [ + { + label: 'Drive', + key: 'driveId', + type: 'dropdown' as const, + required: false, + description: 'The Google Drive where your spreadsheet resides. If nothing is selected, then your personal Google Drive will be used.', + variables: false, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listDrives', + }, + ], + }, + }, + ], + + async run($) { + await newSpreadsheets($); + }, +}); \ No newline at end of file diff --git a/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/new-spreadsheets.ts b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/new-spreadsheets.ts new file mode 100644 index 00000000..e054beb7 --- /dev/null +++ b/packages/backend/src/apps/google-sheets/triggers/new-spreadsheets/new-spreadsheets.ts @@ -0,0 +1,33 @@ +import { IGlobalVariable } from '@automatisch/types'; + +const newSpreadsheets = async ($: IGlobalVariable) => { + const params = { + pageToken: undefined as unknown as string, + orderBy: 'createdTime desc', + q: `mimeType='application/vnd.google-apps.spreadsheet'`, + fields: '*', + pageSize: 1000, + driveId: $.step.parameters.driveId, + }; + + do { + const { data } = await $.http.get( + 'https://www.googleapis.com/drive/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 newSpreadsheets; diff --git a/packages/web/src/components/ControlledAutocomplete/index.tsx b/packages/web/src/components/ControlledAutocomplete/index.tsx index bad45fc0..76d86671 100644 --- a/packages/web/src/components/ControlledAutocomplete/index.tsx +++ b/packages/web/src/components/ControlledAutocomplete/index.tsx @@ -69,7 +69,7 @@ function ControlledAutocomplete( }, fieldState, }) => ( -
+
{/* encapsulated with an element such as div to vertical spacing delegated from parent */} (
  • {option.label}