From c625e03bf89c2fb1006bdfa6cf4f116a3b1499b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Tue, 11 Jun 2024 15:46:23 +0200 Subject: [PATCH] feat(eventbrite): add create event action --- .../eventbrite/actions/create-event/index.js | 157 ++++++++++++++++++ .../src/apps/eventbrite/actions/index.js | 3 + .../src/apps/eventbrite/dynamic-data/index.js | 3 +- .../dynamic-data/list-venues/index.js | 43 +++++ packages/backend/src/apps/eventbrite/index.js | 2 + packages/docs/pages/.vitepress/config.js | 1 + .../docs/pages/apps/eventbrite/actions.md | 12 ++ 7 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/eventbrite/actions/create-event/index.js create mode 100644 packages/backend/src/apps/eventbrite/actions/index.js create mode 100644 packages/backend/src/apps/eventbrite/dynamic-data/list-venues/index.js create mode 100644 packages/docs/pages/apps/eventbrite/actions.md diff --git a/packages/backend/src/apps/eventbrite/actions/create-event/index.js b/packages/backend/src/apps/eventbrite/actions/create-event/index.js new file mode 100644 index 00000000..b6f97a27 --- /dev/null +++ b/packages/backend/src/apps/eventbrite/actions/create-event/index.js @@ -0,0 +1,157 @@ +import defineAction from '../../../../helpers/define-action.js'; +import isEmpty from 'lodash/isEmpty.js'; +import omitBy from 'lodash/omitBy.js'; + +export default defineAction({ + name: 'Create event', + key: 'createEvent', + description: 'Creates a new event.', + arguments: [ + { + label: 'Organization', + key: 'organizationId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listOrganizations', + }, + ], + }, + }, + { + label: 'Name', + key: 'name', + type: 'string', + required: true, + description: '', + variables: true, + }, + { + label: 'Summary', + key: 'summary', + type: 'string', + required: false, + description: '', + variables: true, + }, + { + label: 'Event Start', + key: 'eventStart', + type: 'string', + required: true, + description: 'e.g. 2018-05-12T02:00:00Z', + variables: true, + }, + { + label: 'Event End', + key: 'eventEnd', + type: 'string', + required: true, + description: 'e.g. 2018-05-12T02:00:00Z', + variables: true, + }, + { + label: 'Venue', + key: 'venueId', + type: 'dropdown', + required: false, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listVenues', + }, + { + name: 'parameters.organizationId', + value: '{parameters.organizationId}', + }, + ], + }, + }, + { + label: 'Currency', + key: 'currencyId', + type: 'dropdown', + required: true, + description: 'The ISO 4217 currency code.', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listCurrency', + }, + ], + }, + }, + { + label: 'Listed?', + key: 'listed', + type: 'dropdown', + required: false, + description: 'Can this event be found on Eventbrite?', + variables: true, + options: [ + { label: 'Yes', value: 'true' }, + { label: 'No', value: 'false' }, + ], + }, + ], + + async run($) { + const { + organizationId, + name, + summary, + eventStart, + eventEnd, + venueId, + currencyId, + listed, + } = $.step.parameters; + + const fields = { + name: { + html: name, + }, + summary, + start: { + timezone: 'UTC', + utc: eventStart, + }, + end: { + timezone: 'UTC', + utc: eventEnd, + }, + currency: currencyId, + venue_id: venueId, + listed, + }; + + const filteredFields = omitBy(fields, isEmpty); + + const { data } = await $.http.post( + `/v3/organizations/${organizationId}/events/`, + { + event: filteredFields, + } + ); + + $.setActionItem({ + raw: data, + }); + }, +}); diff --git a/packages/backend/src/apps/eventbrite/actions/index.js b/packages/backend/src/apps/eventbrite/actions/index.js new file mode 100644 index 00000000..b183087b --- /dev/null +++ b/packages/backend/src/apps/eventbrite/actions/index.js @@ -0,0 +1,3 @@ +import createEvent from './create-event/index.js'; + +export default [createEvent]; diff --git a/packages/backend/src/apps/eventbrite/dynamic-data/index.js b/packages/backend/src/apps/eventbrite/dynamic-data/index.js index d29b003b..b813c3f0 100644 --- a/packages/backend/src/apps/eventbrite/dynamic-data/index.js +++ b/packages/backend/src/apps/eventbrite/dynamic-data/index.js @@ -1,4 +1,5 @@ import listEvents from './list-events/index.js'; import listOrganizations from './list-organizations/index.js'; +import listVenues from './list-venues/index.js'; -export default [listEvents, listOrganizations]; +export default [listEvents, listOrganizations, listVenues]; diff --git a/packages/backend/src/apps/eventbrite/dynamic-data/list-venues/index.js b/packages/backend/src/apps/eventbrite/dynamic-data/list-venues/index.js new file mode 100644 index 00000000..889c89f8 --- /dev/null +++ b/packages/backend/src/apps/eventbrite/dynamic-data/list-venues/index.js @@ -0,0 +1,43 @@ +export default { + name: 'List venues', + key: 'listVenues', + + async run($) { + const venues = { + data: [], + }; + const organizationId = $.step.parameters.organizationId; + + if (!organizationId) { + return venues; + } + + const params = { + continuation: undefined, + }; + + do { + const { data } = await $.http.get( + `/v3/organizations/${organizationId}/venues/`, + { + params, + } + ); + + if (data.pagination.has_more_items) { + params.continuation = data.pagination.continuation; + } + + if (data.venues) { + for (const venue of data.venues) { + venues.data.push({ + value: venue.id, + name: venue.name, + }); + } + } + } while (params.continuation); + + return venues; + }, +}; diff --git a/packages/backend/src/apps/eventbrite/index.js b/packages/backend/src/apps/eventbrite/index.js index 61087dce..d56dd6f7 100644 --- a/packages/backend/src/apps/eventbrite/index.js +++ b/packages/backend/src/apps/eventbrite/index.js @@ -3,6 +3,7 @@ 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'; +import actions from './actions/index.js'; export default defineApp({ name: 'Eventbrite', @@ -17,4 +18,5 @@ export default defineApp({ auth, dynamicData, triggers, + actions, }); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index 9e09bc50..b58b449e 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -119,6 +119,7 @@ export default defineConfig({ collapsed: true, items: [ { text: 'Triggers', link: '/apps/eventbrite/triggers' }, + { text: 'Actions', link: '/apps/eventbrite/actions' }, { text: 'Connection', link: '/apps/eventbrite/connection' }, ], }, diff --git a/packages/docs/pages/apps/eventbrite/actions.md b/packages/docs/pages/apps/eventbrite/actions.md new file mode 100644 index 00000000..bfeb1184 --- /dev/null +++ b/packages/docs/pages/apps/eventbrite/actions.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/eventbrite.svg +items: + - name: Create event + desc: Creates a new event. +--- + + + +