diff --git a/packages/backend/src/apps/clickup/dynamic-data/index.js b/packages/backend/src/apps/clickup/dynamic-data/index.js new file mode 100644 index 00000000..5a576a67 --- /dev/null +++ b/packages/backend/src/apps/clickup/dynamic-data/index.js @@ -0,0 +1,4 @@ +import listSpaces from './list-spaces/index.js'; +import listWorkspaces from './list-workspaces/index.js'; + +export default [listSpaces, listWorkspaces]; diff --git a/packages/backend/src/apps/clickup/dynamic-data/list-spaces/index.js b/packages/backend/src/apps/clickup/dynamic-data/list-spaces/index.js new file mode 100644 index 00000000..59ab319b --- /dev/null +++ b/packages/backend/src/apps/clickup/dynamic-data/list-spaces/index.js @@ -0,0 +1,28 @@ +export default { + name: 'List spaces', + key: 'listSpaces', + + async run($) { + const spaces = { + data: [], + }; + const workspaceId = $.step.parameters.workspaceId; + + if (!workspaceId) { + return spaces; + } + + const { data } = await $.http.get(`/v2/team/${workspaceId}/space`); + + if (data.spaces) { + for (const space of data.spaces) { + spaces.data.push({ + value: space.id, + name: space.name, + }); + } + } + + return spaces; + }, +}; diff --git a/packages/backend/src/apps/clickup/dynamic-data/list-workspaces/index.js b/packages/backend/src/apps/clickup/dynamic-data/list-workspaces/index.js new file mode 100644 index 00000000..3f591b5d --- /dev/null +++ b/packages/backend/src/apps/clickup/dynamic-data/list-workspaces/index.js @@ -0,0 +1,23 @@ +export default { + name: 'List workspaces', + key: 'listWorkspaces', + + async run($) { + const workspaces = { + data: [], + }; + + const { data } = await $.http.get('/v2/team'); + + if (data.teams) { + for (const workspace of data.teams) { + workspaces.data.push({ + value: workspace.id, + name: workspace.name, + }); + } + } + + return workspaces; + }, +}; diff --git a/packages/backend/src/apps/clickup/index.js b/packages/backend/src/apps/clickup/index.js index a9dd3268..9602bd65 100644 --- a/packages/backend/src/apps/clickup/index.js +++ b/packages/backend/src/apps/clickup/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 triggers from './triggers/index.js'; +import dynamicData from './dynamic-data/index.js'; export default defineApp({ name: 'ClickUp', @@ -13,4 +15,6 @@ export default defineApp({ supportsConnections: true, beforeRequest: [addAuthHeader], auth, + triggers, + dynamicData, }); diff --git a/packages/backend/src/apps/clickup/triggers/index.js b/packages/backend/src/apps/clickup/triggers/index.js new file mode 100644 index 00000000..dbc26ac7 --- /dev/null +++ b/packages/backend/src/apps/clickup/triggers/index.js @@ -0,0 +1,3 @@ +import newFolders from './new-folders/index.js'; + +export default [newFolders]; diff --git a/packages/backend/src/apps/clickup/triggers/new-folders/index.js b/packages/backend/src/apps/clickup/triggers/new-folders/index.js new file mode 100644 index 00000000..18eb0990 --- /dev/null +++ b/packages/backend/src/apps/clickup/triggers/new-folders/index.js @@ -0,0 +1,105 @@ +import Crypto from 'crypto'; +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New folders', + key: 'newFolder', + type: 'webhook', + description: 'Triggers when a new folder is created.', + arguments: [ + { + label: 'Workspace', + key: 'workspaceId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listWorkspaces', + }, + ], + }, + }, + { + label: 'Space', + key: 'spaceId', + type: 'dropdown', + required: false, + dependsOn: ['parameters.workspaceId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listSpaces', + }, + { + name: 'parameters.workspaceId', + value: '{parameters.workspaceId}', + }, + ], + }, + }, + ], + + async run($) { + const dataItem = { + raw: $.request.body, + meta: { + internalId: Crypto.randomUUID(), + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async testRun($) { + const sampleEventData = { + event: 'folderCreated', + folder_id: '90180382912', + webhook_id: $.webhookUrl.split('/')[5], + }; + + const dataItem = { + raw: sampleEventData, + meta: { + internalId: sampleEventData.webhook_id, + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async registerHook($) { + const { workspaceId, spaceId } = $.step.parameters; + + const payload = { + name: $.flow.id, + endpoint: $.webhookUrl, + events: ['folderCreated'], + }; + + if (spaceId) { + payload.space_id = spaceId; + } + + const { data } = await $.http.post( + `/v2/team/${workspaceId}/webhook`, + payload + ); + + await $.flow.setRemoteWebhookId(data.id); + }, + + async unregisterHook($) { + await $.http.delete(`/v2/webhook/${$.flow.remoteWebhookId}`); + }, +}); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index beef4aa8..52e2fe45 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -81,7 +81,10 @@ export default defineConfig({ text: 'ClickUp', collapsible: true, collapsed: true, - items: [{ text: 'Connection', link: '/apps/clickup/connection' }], + items: [ + { text: 'Triggers', link: '/apps/clickup/triggers' }, + { text: 'Connection', link: '/apps/clickup/connection' }, + ], }, { text: 'DeepL', diff --git a/packages/docs/pages/apps/clickup/triggers.md b/packages/docs/pages/apps/clickup/triggers.md new file mode 100644 index 00000000..5b21b202 --- /dev/null +++ b/packages/docs/pages/apps/clickup/triggers.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/clickup.svg +items: + - name: New folders + desc: Triggers when a new folder is created. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index faebf873..4be6447b 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -5,6 +5,7 @@ The following integrations are currently supported by Automatisch. - [Airtable](/apps/airtable/actions) - [Appwrite](/apps/appwrite/triggers) - [Carbone](/apps/carbone/actions) +- [ClickUp](/apps/clickup/triggers) - [Datastore](/apps/datastore/actions) - [DeepL](/apps/deepl/actions) - [Delay](/apps/delay/actions)