From bbecfdb718c2226f4b35b2a7b935eed67cd283f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Wed, 31 Jan 2024 18:00:53 +0300 Subject: [PATCH] feat(mailchimp): add new subscribers trigger --- .../src/apps/mailchimp/dynamic-data/index.js | 3 + .../dynamic-data/list-audiences/index.js | 40 +++++++ packages/backend/src/apps/mailchimp/index.js | 4 + .../src/apps/mailchimp/triggers/index.js | 3 + .../triggers/new-subscribers/index.js | 105 ++++++++++++++++++ .../docs/pages/apps/mailchimp/triggers.md | 12 ++ packages/docs/pages/guide/available-apps.md | 1 + 7 files changed, 168 insertions(+) create mode 100644 packages/backend/src/apps/mailchimp/dynamic-data/index.js create mode 100644 packages/backend/src/apps/mailchimp/dynamic-data/list-audiences/index.js create mode 100644 packages/backend/src/apps/mailchimp/triggers/index.js create mode 100644 packages/backend/src/apps/mailchimp/triggers/new-subscribers/index.js create mode 100644 packages/docs/pages/apps/mailchimp/triggers.md diff --git a/packages/backend/src/apps/mailchimp/dynamic-data/index.js b/packages/backend/src/apps/mailchimp/dynamic-data/index.js new file mode 100644 index 00000000..8ec6b75b --- /dev/null +++ b/packages/backend/src/apps/mailchimp/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listAudiences from './list-audiences/index.js'; + +export default [listAudiences]; diff --git a/packages/backend/src/apps/mailchimp/dynamic-data/list-audiences/index.js b/packages/backend/src/apps/mailchimp/dynamic-data/list-audiences/index.js new file mode 100644 index 00000000..05646057 --- /dev/null +++ b/packages/backend/src/apps/mailchimp/dynamic-data/list-audiences/index.js @@ -0,0 +1,40 @@ +export default { + name: 'List audiences', + key: 'listAudiences', + + async run($) { + const audiences = { + data: [], + }; + let hasMore = false; + + const params = { + sort_field: 'date_created', + sort_dir: 'DESC', + count: 1000, + offset: 0, + }; + + do { + const { data } = await $.http.get('/3.0/lists', { params }); + params.offset = params.offset + params.count; + + if (data?.lists) { + for (const audience of data.lists) { + audiences.data.push({ + value: audience.id, + name: audience.name, + }); + } + } + + if (data.total_items > params.offset) { + hasMore = true; + } else { + hasMore = false; + } + } while (hasMore); + + return audiences; + }, +}; diff --git a/packages/backend/src/apps/mailchimp/index.js b/packages/backend/src/apps/mailchimp/index.js index 170b3e95..9dd8a71e 100644 --- a/packages/backend/src/apps/mailchimp/index.js +++ b/packages/backend/src/apps/mailchimp/index.js @@ -2,6 +2,8 @@ import defineApp from '../../helpers/define-app.js'; import addAuthHeader from './common/add-auth-header.js'; import setBaseUrl from './common/set-base-url.js'; import auth from './auth/index.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'Mailchimp', @@ -14,4 +16,6 @@ export default defineApp({ supportsConnections: true, beforeRequest: [setBaseUrl, addAuthHeader], auth, + triggers, + dynamicData, }); diff --git a/packages/backend/src/apps/mailchimp/triggers/index.js b/packages/backend/src/apps/mailchimp/triggers/index.js new file mode 100644 index 00000000..97173907 --- /dev/null +++ b/packages/backend/src/apps/mailchimp/triggers/index.js @@ -0,0 +1,3 @@ +import newSubscribers from './new-subscribers/index.js'; + +export default [newSubscribers]; diff --git a/packages/backend/src/apps/mailchimp/triggers/new-subscribers/index.js b/packages/backend/src/apps/mailchimp/triggers/new-subscribers/index.js new file mode 100644 index 00000000..9455373b --- /dev/null +++ b/packages/backend/src/apps/mailchimp/triggers/new-subscribers/index.js @@ -0,0 +1,105 @@ +import Crypto from 'crypto'; +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New subscribers', + key: 'newSubscribers', + type: 'webhook', + description: 'Triggers when a new subscriber is appended to an audience.', + arguments: [ + { + label: 'Audience', + key: 'audienceId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listAudiences', + }, + ], + }, + }, + ], + + async run($) { + const dataItem = { + raw: $.request.body, + meta: { + internalId: Crypto.randomUUID(), + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async testRun($) { + const audienceId = $.step.parameters.audienceId; + + const computedWebhookEvent = { + data: { + id: Crypto.randomUUID(), + email: 'user@automatisch.io', + ip_opt: '127.0.0.1', + merges: { + EMAIL: 'user@automatisch.io', + FNAME: 'FNAME', + LNAME: 'LNAME', + PHONE: '', + ADDRESS: '', + BIRTHDAY: '', + }, + web_id: Crypto.randomUUID(), + list_id: audienceId, + email_type: 'html', + }, + type: 'subscribe', + fired_at: new Date().toLocaleString(), + }; + + const dataItem = { + raw: computedWebhookEvent, + meta: { + internalId: computedWebhookEvent.id, + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async registerHook($) { + const audienceId = $.step.parameters.audienceId; + + const payload = { + url: $.webhookUrl, + events: { + subscribe: true, + }, + sources: { + user: true, + admin: true, + api: true, + }, + }; + + const response = await $.http.post( + `/3.0/lists/${audienceId}/webhooks`, + payload + ); + + await $.flow.setRemoteWebhookId(response.data.id); + }, + + async unregisterHook($) { + const audienceId = $.step.parameters.audienceId; + + await $.http.delete( + `/3.0/lists/${audienceId}/webhooks/${$.flow.remoteWebhookId}` + ); + }, +}); diff --git a/packages/docs/pages/apps/mailchimp/triggers.md b/packages/docs/pages/apps/mailchimp/triggers.md new file mode 100644 index 00000000..3b3530c2 --- /dev/null +++ b/packages/docs/pages/apps/mailchimp/triggers.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/mailchimp.svg +items: + - name: New subscribers + desc: Triggers when a new subscriber is appended to an audience. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index 60be7318..e2ace1b9 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -25,6 +25,7 @@ The following integrations are currently supported by Automatisch. - [HTTP Request](/apps/http-request/actions) - [HubSpot](/apps/hubspot/actions) - [Invoice Ninja](/apps/invoice-ninja/triggers) +- [Mailchimp](/apps/mailchimp/triggers) - [MailerLite](/apps/mailerlite/triggers) - [Mattermost](/apps/mattermost/actions) - [Miro](/apps/miro/actions)