From 9a5cef08d642b4983d5d524cab1aa686d8ac6ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Wed, 31 Jan 2024 18:33:09 +0300 Subject: [PATCH] feat(mailchimp): add new unsubscribers trigger --- .../src/apps/mailchimp/triggers/index.js | 3 +- .../triggers/new-unsubscribers/index.js | 108 ++++++++++++++++++ .../docs/pages/apps/mailchimp/triggers.md | 2 + 3 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/mailchimp/triggers/new-unsubscribers/index.js diff --git a/packages/backend/src/apps/mailchimp/triggers/index.js b/packages/backend/src/apps/mailchimp/triggers/index.js index 97173907..ec7f4fa0 100644 --- a/packages/backend/src/apps/mailchimp/triggers/index.js +++ b/packages/backend/src/apps/mailchimp/triggers/index.js @@ -1,3 +1,4 @@ import newSubscribers from './new-subscribers/index.js'; +import newUnsubscribers from './new-unsubscribers/index.js'; -export default [newSubscribers]; +export default [newSubscribers, newUnsubscribers]; diff --git a/packages/backend/src/apps/mailchimp/triggers/new-unsubscribers/index.js b/packages/backend/src/apps/mailchimp/triggers/new-unsubscribers/index.js new file mode 100644 index 00000000..731fea7a --- /dev/null +++ b/packages/backend/src/apps/mailchimp/triggers/new-unsubscribers/index.js @@ -0,0 +1,108 @@ +import Crypto from 'crypto'; +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New unsubscribers', + key: 'newUnsubscribers', + type: 'webhook', + description: 'Triggers when any existing subscriber opts out of 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', + action: 'unsub', + ip_opt: '127.0.0.1', + merges: { + EMAIL: 'user@automatisch.io', + FNAME: 'FNAME', + LNAME: 'LNAME', + PHONE: '', + ADDRESS: '', + BIRTHDAY: '', + }, + reason: 'manual', + web_id: Crypto.randomUUID(), + list_id: audienceId, + email_type: 'html', + campaign_id: Crypto.randomUUID(), + }, + type: 'unsubscribe', + 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: { + unsubscribe: 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 index 3b3530c2..54ceb6ca 100644 --- a/packages/docs/pages/apps/mailchimp/triggers.md +++ b/packages/docs/pages/apps/mailchimp/triggers.md @@ -3,6 +3,8 @@ favicon: /favicons/mailchimp.svg items: - name: New subscribers desc: Triggers when a new subscriber is appended to an audience. + - name: New unsubscribers + desc: Triggers when any existing subscriber opts out of an audience. ---