From 30c95da90e88139d54d550e09f02fdd91079ad7b Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Tue, 3 Jan 2023 21:03:33 +0100 Subject: [PATCH] feat(google-forms): add new form responses trigger --- .../apps/google-forms/common/auth-scope.ts | 1 + .../backend/src/apps/google-forms/index.ts | 2 ++ .../src/apps/google-forms/triggers/index.ts | 3 ++ .../triggers/new-form-responses/index.ts | 33 +++++++++++++++++++ .../new-form-responses/new-form-responses.ts | 28 ++++++++++++++++ 5 files changed, 67 insertions(+) create mode 100644 packages/backend/src/apps/google-forms/triggers/index.ts create mode 100644 packages/backend/src/apps/google-forms/triggers/new-form-responses/index.ts create mode 100644 packages/backend/src/apps/google-forms/triggers/new-form-responses/new-form-responses.ts diff --git a/packages/backend/src/apps/google-forms/common/auth-scope.ts b/packages/backend/src/apps/google-forms/common/auth-scope.ts index dd65c6bd..397255c3 100644 --- a/packages/backend/src/apps/google-forms/common/auth-scope.ts +++ b/packages/backend/src/apps/google-forms/common/auth-scope.ts @@ -1,5 +1,6 @@ const authScope: string[] = [ 'https://www.googleapis.com/auth/forms.body.readonly', + 'https://www.googleapis.com/auth/forms.responses.readonly', 'https://www.googleapis.com/auth/drive.readonly', 'https://www.googleapis.com/auth/userinfo.email', 'profile', diff --git a/packages/backend/src/apps/google-forms/index.ts b/packages/backend/src/apps/google-forms/index.ts index 7836ac60..2114432f 100644 --- a/packages/backend/src/apps/google-forms/index.ts +++ b/packages/backend/src/apps/google-forms/index.ts @@ -1,6 +1,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({ @@ -14,5 +15,6 @@ export default defineApp({ supportsConnections: true, beforeRequest: [addAuthHeader], auth, + triggers, dynamicData, }); diff --git a/packages/backend/src/apps/google-forms/triggers/index.ts b/packages/backend/src/apps/google-forms/triggers/index.ts new file mode 100644 index 00000000..7c035992 --- /dev/null +++ b/packages/backend/src/apps/google-forms/triggers/index.ts @@ -0,0 +1,3 @@ +import newFormResponses from './new-form-responses'; + +export default [newFormResponses]; diff --git a/packages/backend/src/apps/google-forms/triggers/new-form-responses/index.ts b/packages/backend/src/apps/google-forms/triggers/new-form-responses/index.ts new file mode 100644 index 00000000..187229a5 --- /dev/null +++ b/packages/backend/src/apps/google-forms/triggers/new-form-responses/index.ts @@ -0,0 +1,33 @@ +import defineTrigger from '../../../../helpers/define-trigger'; +import newFormResponses from './new-form-responses'; + +export default defineTrigger({ + name: 'New Form Responses', + key: 'newFormResponses', + pollInterval: 15, + description: 'Triggers when a new form response is submitted.', + arguments: [ + { + label: 'Form', + key: 'formId', + type: 'dropdown' as const, + required: true, + description: 'Pick a form to receive form responses.', + variables: false, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listForms', + }, + ], + }, + }, + ], + + async run($) { + await newFormResponses($); + }, +}); diff --git a/packages/backend/src/apps/google-forms/triggers/new-form-responses/new-form-responses.ts b/packages/backend/src/apps/google-forms/triggers/new-form-responses/new-form-responses.ts new file mode 100644 index 00000000..97c6fae8 --- /dev/null +++ b/packages/backend/src/apps/google-forms/triggers/new-form-responses/new-form-responses.ts @@ -0,0 +1,28 @@ +import { IGlobalVariable } from '@automatisch/types'; + +const newResponses = async ($: IGlobalVariable) => { + const params = { + pageToken: undefined as unknown as string, + }; + + do { + const pathname = `/v1/forms/${$.step.parameters.formId}/responses`; + const { data } = await $.http.get(pathname, { params }); + params.pageToken = data.nextPageToken; + + if (data.responses?.length) { + for (const formResponse of data.responses) { + const dataItem = { + raw: formResponse, + meta: { + internalId: formResponse.responseId, + }, + }; + + $.pushTriggerItem(dataItem); + } + } + } while (params.pageToken); +}; + +export default newResponses;