From b6b4ed5ad219988d59a538d96854d7d316bb4a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Mon, 22 Apr 2024 14:46:19 +0200 Subject: [PATCH] feat(gmail): add new emails trigger --- .../src/apps/gmail/auth/verify-credentials.js | 1 + .../src/apps/gmail/dynamic-data/index.js | 3 + .../gmail/dynamic-data/list-labels/index.js | 22 ++++++ packages/backend/src/apps/gmail/index.js | 5 ++ .../backend/src/apps/gmail/triggers/index.js | 3 + .../apps/gmail/triggers/new-emails/index.js | 68 +++++++++++++++++++ packages/docs/pages/apps/gmail/triggers.md | 12 ++++ packages/docs/pages/guide/available-apps.md | 1 + 8 files changed, 115 insertions(+) create mode 100644 packages/backend/src/apps/gmail/dynamic-data/index.js create mode 100644 packages/backend/src/apps/gmail/dynamic-data/list-labels/index.js create mode 100644 packages/backend/src/apps/gmail/triggers/index.js create mode 100644 packages/backend/src/apps/gmail/triggers/new-emails/index.js create mode 100644 packages/docs/pages/apps/gmail/triggers.md diff --git a/packages/backend/src/apps/gmail/auth/verify-credentials.js b/packages/backend/src/apps/gmail/auth/verify-credentials.js index a636b72c..8c9b7afe 100644 --- a/packages/backend/src/apps/gmail/auth/verify-credentials.js +++ b/packages/backend/src/apps/gmail/auth/verify-credentials.js @@ -36,6 +36,7 @@ const verifyCredentials = async ($) => { refreshToken: data.refresh_token, resourceName: currentUser.resourceName, screenName: `${displayName} - ${email}`, + userId: email, }); }; diff --git a/packages/backend/src/apps/gmail/dynamic-data/index.js b/packages/backend/src/apps/gmail/dynamic-data/index.js new file mode 100644 index 00000000..a7a52e3a --- /dev/null +++ b/packages/backend/src/apps/gmail/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listLabels from './list-labels/index.js'; + +export default [listLabels]; diff --git a/packages/backend/src/apps/gmail/dynamic-data/list-labels/index.js b/packages/backend/src/apps/gmail/dynamic-data/list-labels/index.js new file mode 100644 index 00000000..65decf94 --- /dev/null +++ b/packages/backend/src/apps/gmail/dynamic-data/list-labels/index.js @@ -0,0 +1,22 @@ +export default { + name: 'List labels', + key: 'listLabels', + + async run($) { + const labels = { + data: [], + }; + const userId = $.auth.data.userId; + + const { data } = await $.http.get(`/gmail/v1/users/${userId}/labels`); + + for (const label of data.labels) { + labels.data.push({ + value: label.id, + name: label.name, + }); + } + + return labels; + }, +}; diff --git a/packages/backend/src/apps/gmail/index.js b/packages/backend/src/apps/gmail/index.js index 0b9bfa0f..6dc1654f 100644 --- a/packages/backend/src/apps/gmail/index.js +++ b/packages/backend/src/apps/gmail/index.js @@ -1,6 +1,9 @@ import defineApp from '../../helpers/define-app.js'; import addAuthHeader from './common/add-auth-header.js'; import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; + export default defineApp({ name: 'Gmail', key: 'gmail', @@ -12,4 +15,6 @@ export default defineApp({ supportsConnections: true, beforeRequest: [addAuthHeader], auth, + triggers, + dynamicData, }); diff --git a/packages/backend/src/apps/gmail/triggers/index.js b/packages/backend/src/apps/gmail/triggers/index.js new file mode 100644 index 00000000..3ce85787 --- /dev/null +++ b/packages/backend/src/apps/gmail/triggers/index.js @@ -0,0 +1,3 @@ +import newEmails from './new-emails/index.js'; + +export default [newEmails]; diff --git a/packages/backend/src/apps/gmail/triggers/new-emails/index.js b/packages/backend/src/apps/gmail/triggers/new-emails/index.js new file mode 100644 index 00000000..14006b56 --- /dev/null +++ b/packages/backend/src/apps/gmail/triggers/new-emails/index.js @@ -0,0 +1,68 @@ +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New emails', + key: 'newEmails', + pollInterval: 15, + description: + 'Triggers when a new email is received in the specified mailbox.', + arguments: [ + { + label: 'Label', + key: 'labelId', + type: 'dropdown', + required: false, + description: + "If you don't choose a label, this Zap will trigger for all emails, including Drafts.", + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listLabels', + }, + ], + }, + }, + ], + + async run($) { + const userId = $.auth.data.userId; + const labelId = $.step.parameters.labelId; + + const params = { + maxResults: 500, + pageToken: undefined, + }; + + if (labelId) { + params.labelIds = labelId; + } + + do { + const { data } = await $.http.get(`/gmail/v1/users/${userId}/messages`, { + params, + }); + params.pageToken = data.nextPageToken; + + if (!data?.messages?.length) { + return; + } + + for (const message of data.messages) { + const { data: messageData } = await $.http.get( + `/gmail/v1/users/${userId}/messages/${message.id}` + ); + + $.pushTriggerItem({ + raw: messageData, + meta: { + internalId: messageData.id, + }, + }); + } + } while (params.pageToken); + }, +}); diff --git a/packages/docs/pages/apps/gmail/triggers.md b/packages/docs/pages/apps/gmail/triggers.md new file mode 100644 index 00000000..49205c51 --- /dev/null +++ b/packages/docs/pages/apps/gmail/triggers.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/gmail.svg +items: + - name: New emails + desc: Triggers when a new email is received in the specified mailbox. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index d0f7e7ee..9ccd44bb 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -14,6 +14,7 @@ The following integrations are currently supported by Automatisch. - [Ghost](/apps/ghost/triggers) - [GitHub](/apps/github/triggers) - [GitLab](/apps/gitlab/triggers) +- [Gmail](/apps/gmail/triggers) - [Google Calendar](/apps/google-calendar/triggers) - [Google Drive](/apps/google-drive/triggers) - [Google Forms](/apps/google-forms/triggers)