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)