diff --git a/packages/backend/src/apps/surveymonkey/dynamic-data/index.js b/packages/backend/src/apps/surveymonkey/dynamic-data/index.js new file mode 100644 index 00000000..5082bd6e --- /dev/null +++ b/packages/backend/src/apps/surveymonkey/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listSurveys from './list-surveys/index.js'; + +export default [listSurveys]; diff --git a/packages/backend/src/apps/surveymonkey/dynamic-data/list-surveys/index.js b/packages/backend/src/apps/surveymonkey/dynamic-data/list-surveys/index.js new file mode 100644 index 00000000..5f67dbed --- /dev/null +++ b/packages/backend/src/apps/surveymonkey/dynamic-data/list-surveys/index.js @@ -0,0 +1,38 @@ +export default { + name: 'List surveys', + key: 'listSurveys', + + async run($) { + const surveys = { + data: [], + }; + + const params = { + page: 1, + per_page: 100, + sort_by: 'date_modified', + sort_order: 'DESC', + }; + + let fetchedSum = 0; + let total; + do { + const { data } = await $.http.get(`/v3/surveys`, { params }); + + params.page = params.page + 1; + fetchedSum = fetchedSum + params.per_page; + total = data.total; + + if (data.data) { + for (const survey of data.data) { + surveys.data.push({ + value: survey.id, + name: survey.title, + }); + } + } + } while (fetchedSum <= total); + + return surveys; + }, +}; diff --git a/packages/backend/src/apps/surveymonkey/index.js b/packages/backend/src/apps/surveymonkey/index.js index 25292244..6c6f3bf0 100644 --- a/packages/backend/src/apps/surveymonkey/index.js +++ b/packages/backend/src/apps/surveymonkey/index.js @@ -2,6 +2,8 @@ import defineApp from '../../helpers/define-app.js'; import addAuthHeader from './common/add-auth-header.js'; import auth from './auth/index.js'; import setBaseUrl from './common/set-base-url.js'; +import triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'SurveyMonkey', @@ -14,4 +16,6 @@ export default defineApp({ supportsConnections: true, beforeRequest: [setBaseUrl, addAuthHeader], auth, + triggers, + dynamicData, }); diff --git a/packages/backend/src/apps/surveymonkey/triggers/index.js b/packages/backend/src/apps/surveymonkey/triggers/index.js new file mode 100644 index 00000000..2cdfa99b --- /dev/null +++ b/packages/backend/src/apps/surveymonkey/triggers/index.js @@ -0,0 +1,3 @@ +import newResponseNotification from './new-response-notification/index.js'; + +export default [newResponseNotification]; diff --git a/packages/backend/src/apps/surveymonkey/triggers/new-response-notification/index.js b/packages/backend/src/apps/surveymonkey/triggers/new-response-notification/index.js new file mode 100644 index 00000000..92e2ba3b --- /dev/null +++ b/packages/backend/src/apps/surveymonkey/triggers/new-response-notification/index.js @@ -0,0 +1,78 @@ +import Crypto from 'crypto'; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New response notification', + key: 'newResponseNotification', + type: 'webhook', + description: 'Triggers a notification upon the completion of your survey.', + arguments: [ + { + label: 'Survey', + key: 'surveyId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listSurveys', + }, + ], + }, + }, + ], + + async run($) { + const dataItem = { + raw: $.request.body, + meta: { + internalId: Crypto.randomUUID(), + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async testRun($) { + const lastExecutionStep = await $.getLastExecutionStep(); + + if (!isEmpty(lastExecutionStep?.dataOut)) { + $.pushTriggerItem({ + raw: lastExecutionStep.dataOut, + meta: { + internalId: '', + }, + }); + } + }, + + async registerHook($) { + const surveyId = $.step.parameters.surveyId; + + const body = JSON.stringify({ + name: $.flow.id, + subscription_url: $.webhookUrl, + event_type: 'response_completed', + object_type: 'survey', + object_ids: [surveyId], + }); + + const { data } = await $.http.post('/v3/webhooks?bypass_ping=true', body, { + headers: { + 'Content-Type': 'application/json', + }, + }); + + await $.flow.setRemoteWebhookId(data.id); + }, + + async unregisterHook($) { + await $.http.delete(`/v3/webhooks/${$.flow.remoteWebhookId}`); + }, +}); diff --git a/packages/docs/pages/apps/surveymonkey/triggers.md b/packages/docs/pages/apps/surveymonkey/triggers.md new file mode 100644 index 00000000..71f8f422 --- /dev/null +++ b/packages/docs/pages/apps/surveymonkey/triggers.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/surveymonkey.svg +items: + - name: New response notification + desc: Triggers a notification upon the completion of your survey. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index ad2b4c0c..502df55c 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -46,6 +46,7 @@ The following integrations are currently supported by Automatisch. - [Spotify](/apps/spotify/actions) - [Strava](/apps/strava/actions) - [Stripe](/apps/stripe/triggers) +- [SurveyMonkey](/apps/surveymonkey/triggers) - [Telegram](/apps/telegram-bot/actions) - [Todoist](/apps/todoist/triggers) - [Trello](/apps/trello/actions)