diff --git a/packages/backend/src/apps/eventbrite/dynamic-data/index.js b/packages/backend/src/apps/eventbrite/dynamic-data/index.js new file mode 100644 index 00000000..de48bc3f --- /dev/null +++ b/packages/backend/src/apps/eventbrite/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listOrganizations from './list-organizations/index.js'; + +export default [listOrganizations]; diff --git a/packages/backend/src/apps/eventbrite/dynamic-data/list-organizations/index.js b/packages/backend/src/apps/eventbrite/dynamic-data/list-organizations/index.js new file mode 100644 index 00000000..6ddf2a6f --- /dev/null +++ b/packages/backend/src/apps/eventbrite/dynamic-data/list-organizations/index.js @@ -0,0 +1,35 @@ +export default { + name: 'List organizations', + key: 'listOrganizations', + + async run($) { + const organizations = { + data: [], + }; + + const params = { + continuation: undefined, + }; + + do { + const { data } = await $.http.get('/v3/users/me/organizations', { + params, + }); + + if (data.pagination.has_more_items) { + params.continuation = data.pagination.continuation; + } + + if (data.organizations) { + for (const organization of data.organizations) { + organizations.data.push({ + value: organization.id, + name: organization.name, + }); + } + } + } while (params.continuation); + + return organizations; + }, +}; diff --git a/packages/backend/src/apps/eventbrite/index.js b/packages/backend/src/apps/eventbrite/index.js index a46cbd3f..61087dce 100644 --- a/packages/backend/src/apps/eventbrite/index.js +++ b/packages/backend/src/apps/eventbrite/index.js @@ -1,6 +1,8 @@ import defineApp from '../../helpers/define-app.js'; import addAuthHeader from './common/add-auth-header.js'; import auth from './auth/index.js'; +import dynamicData from './dynamic-data/index.js'; +import triggers from './triggers/index.js'; export default defineApp({ name: 'Eventbrite', @@ -13,4 +15,6 @@ export default defineApp({ supportsConnections: true, beforeRequest: [addAuthHeader], auth, + dynamicData, + triggers, }); diff --git a/packages/backend/src/apps/eventbrite/triggers/index.js b/packages/backend/src/apps/eventbrite/triggers/index.js new file mode 100644 index 00000000..7ff60c6c --- /dev/null +++ b/packages/backend/src/apps/eventbrite/triggers/index.js @@ -0,0 +1,3 @@ +import newEvents from './new-events/index.js'; + +export default [newEvents]; diff --git a/packages/backend/src/apps/eventbrite/triggers/new-events/index.js b/packages/backend/src/apps/eventbrite/triggers/new-events/index.js new file mode 100644 index 00000000..dee58a8c --- /dev/null +++ b/packages/backend/src/apps/eventbrite/triggers/new-events/index.js @@ -0,0 +1,98 @@ +import Crypto from 'crypto'; +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New events', + key: 'newEvents', + type: 'webhook', + description: + 'Triggers when a new event is published and live within an organization.', + arguments: [ + { + label: 'Organization', + key: 'organizationId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listOrganizations', + }, + ], + }, + }, + ], + + async run($) { + const dataItem = { + raw: $.request.body, + meta: { + internalId: Crypto.randomUUID(), + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async testRun($) { + const organizationId = $.step.parameters.organizationId; + + const params = { + orderBy: 'created_desc', + status: 'all', + }; + + const { + data: { events }, + } = await $.http.get(`/v3/organizations/${organizationId}/events/`, params); + + if (events.length === 0) { + return; + } + + const computedWebhookEvent = { + config: { + action: 'event.published', + user_id: events[0].organization_id, + webhook_id: '11111111', + endpoint_url: $.webhookUrl, + }, + api_url: events[0].resource_uri, + }; + + const dataItem = { + raw: computedWebhookEvent, + meta: { + internalId: computedWebhookEvent.user_id, + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async registerHook($) { + const organizationId = $.step.parameters.organizationId; + + const payload = { + endpoint_url: $.webhookUrl, + actions: 'event.published', + event_id: '', + }; + + const { data } = await $.http.post( + `/v3/organizations/${organizationId}/webhooks/`, + payload + ); + + await $.flow.setRemoteWebhookId(data.id); + }, + + async unregisterHook($) { + await $.http.delete(`/v3/webhooks/${$.flow.remoteWebhookId}/`); + }, +}); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index ce42ae1d..9e09bc50 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -117,7 +117,10 @@ export default defineConfig({ text: 'Eventbrite', collapsible: true, collapsed: true, - items: [{ text: 'Connection', link: '/apps/eventbrite/connection' }], + items: [ + { text: 'Triggers', link: '/apps/eventbrite/triggers' }, + { text: 'Connection', link: '/apps/eventbrite/connection' }, + ], }, { text: 'Filter', diff --git a/packages/docs/pages/apps/eventbrite/triggers.md b/packages/docs/pages/apps/eventbrite/triggers.md new file mode 100644 index 00000000..bd286730 --- /dev/null +++ b/packages/docs/pages/apps/eventbrite/triggers.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/eventbrite.svg +items: + - name: New events + desc: Triggers when a new event is published and live within an organization. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index ad2b4c0c..156a7ac2 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -11,6 +11,7 @@ The following integrations are currently supported by Automatisch. - [Discord](/apps/discord/actions) - [Disqus](/apps/disqus/triggers) - [Dropbox](/apps/dropbox/actions) +- [Eventbrite](/apps/eventbrite/triggers) - [Filter](/apps/filter/actions) - [Flickr](/apps/flickr/triggers) - [Formatter](/apps/formatter/actions)