diff --git a/packages/backend/src/apps/jotform/dynamic-data/index.js b/packages/backend/src/apps/jotform/dynamic-data/index.js new file mode 100644 index 00000000..0a58430e --- /dev/null +++ b/packages/backend/src/apps/jotform/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listForms from './list-forms/index.js'; + +export default [listForms]; diff --git a/packages/backend/src/apps/jotform/dynamic-data/list-forms/index.js b/packages/backend/src/apps/jotform/dynamic-data/list-forms/index.js new file mode 100644 index 00000000..180425bc --- /dev/null +++ b/packages/backend/src/apps/jotform/dynamic-data/list-forms/index.js @@ -0,0 +1,41 @@ +export default { + name: 'List forms', + key: 'listForms', + + async run($) { + const forms = { + data: [], + }; + let hasMore = false; + + const params = { + limit: 1000, + offset: 0, + orderby: 'created_at', + }; + + do { + const { data } = await $.http.get('/user/forms', { params }); + params.offset = params.offset + params.limit; + + if (data.content?.length) { + for (const form of data.content) { + if (form.status === 'ENABLED') { + forms.data.push({ + value: form.id, + name: form.title, + }); + } + } + } + + if (data.resultSet.count > data.resultSet.limit) { + hasMore = true; + } else { + hasMore = false; + } + } while (hasMore); + + return forms; + }, +}; diff --git a/packages/backend/src/apps/jotform/index.js b/packages/backend/src/apps/jotform/index.js index 697a024b..b4242bdc 100644 --- a/packages/backend/src/apps/jotform/index.js +++ b/packages/backend/src/apps/jotform/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: 'Jotform', @@ -14,4 +16,6 @@ export default defineApp({ primaryColor: 'FF6100', beforeRequest: [setBaseUrl, addAuthHeader], auth, + triggers, + dynamicData, }); diff --git a/packages/backend/src/apps/jotform/triggers/index.js b/packages/backend/src/apps/jotform/triggers/index.js new file mode 100644 index 00000000..b25ac2ce --- /dev/null +++ b/packages/backend/src/apps/jotform/triggers/index.js @@ -0,0 +1,3 @@ +import newSubmissions from './new-submissions/index.js'; + +export default [newSubmissions]; diff --git a/packages/backend/src/apps/jotform/triggers/new-submissions/index.js b/packages/backend/src/apps/jotform/triggers/new-submissions/index.js new file mode 100644 index 00000000..e5c99460 --- /dev/null +++ b/packages/backend/src/apps/jotform/triggers/new-submissions/index.js @@ -0,0 +1,109 @@ +import Crypto from 'crypto'; +import { URLSearchParams } from 'url'; +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New submissions', + key: 'newSubmissions', + type: 'webhook', + description: + 'Triggers when a new submission has been added to a specific form.', + arguments: [ + { + label: 'Form', + key: 'formId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listForms', + }, + ], + }, + }, + ], + + async run($) { + const dataItem = { + raw: $.request.body, + meta: { + internalId: Crypto.randomUUID(), + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async testRun($) { + const sampleEventData = { + ip: '127.0.0.1', + type: 'WEB', + appID: '', + event: '', + action: '', + formID: Crypto.randomUUID(), + parent: '', + pretty: 'Name:test, E-mail:user@automatisch.io', + teamID: '', + unread: '', + product: '', + subject: '', + isSilent: '', + username: 'username', + deviceIDs: 'Array', + formTitle: 'Opt-In Form-Get Free Email Updates!', + fromTable: '', + customBody: '', + documentID: '', + rawRequest: '', + webhookURL: '', + customTitle: '', + trackAction: 'Array', + customParams: '', + submissionID: Crypto.randomUUID(), + customBodyParams: 'Array', + customTitleParams: 'Array', + }; + + const dataItem = { + raw: sampleEventData, + meta: { + internalId: sampleEventData.submissionID, + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async registerHook($) { + const formId = $.step.parameters.formId; + + const params = new URLSearchParams({ + webhookURL: $.webhookUrl, + }); + + const { data } = await $.http.post( + `/form/${formId}/webhooks`, + params.toString() + ); + + await $.flow.setRemoteWebhookId(data.content[0]); + }, + + async unregisterHook($) { + const formId = $.step.parameters.formId; + + const { data } = await $.http.get(`/form/${formId}/webhooks`); + + const webhookURLs = Object.values(data.content); + const webhookId = webhookURLs.findIndex((url) => url === $.webhookUrl); + + await $.http.delete(`/form/${formId}/webhooks/${webhookId}`); + }, +}); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index c83c75e6..ad681517 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -256,7 +256,10 @@ export default defineConfig({ text: 'Jotform', collapsible: true, collapsed: true, - items: [{ text: 'Connection', link: '/apps/jotform/connection' }], + items: [ + { text: 'Triggers', link: '/apps/jotform/triggers' }, + { text: 'Connection', link: '/apps/jotform/connection' }, + ], }, { text: 'Mailchimp', diff --git a/packages/docs/pages/apps/jotform/triggers.md b/packages/docs/pages/apps/jotform/triggers.md new file mode 100644 index 00000000..febf5f55 --- /dev/null +++ b/packages/docs/pages/apps/jotform/triggers.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/jotform.svg +items: + - name: New submissions + desc: Triggers when a new submission has been added to a specific form. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index e2ace1b9..faebf873 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) +- [Jotform](/apps/jotform/triggers) - [Mailchimp](/apps/mailchimp/triggers) - [MailerLite](/apps/mailerlite/triggers) - [Mattermost](/apps/mattermost/actions)