From 200e483574f07d73eec2682940f6a5bf4517e132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Wed, 14 Feb 2024 15:30:37 +0300 Subject: [PATCH] feat(clickup): add new tasks trigger --- .../src/apps/clickup/dynamic-data/index.js | 4 +- .../clickup/dynamic-data/list-lists/index.js | 28 +++ .../clickup/dynamic-data/list-tasks/index.js | 41 ++++ .../src/apps/clickup/triggers/index.js | 3 +- .../apps/clickup/triggers/new-tasks/index.js | 186 ++++++++++++++++++ packages/docs/pages/apps/clickup/triggers.md | 2 + 6 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 packages/backend/src/apps/clickup/dynamic-data/list-lists/index.js create mode 100644 packages/backend/src/apps/clickup/dynamic-data/list-tasks/index.js create mode 100644 packages/backend/src/apps/clickup/triggers/new-tasks/index.js diff --git a/packages/backend/src/apps/clickup/dynamic-data/index.js b/packages/backend/src/apps/clickup/dynamic-data/index.js index 30265478..dcc5fcf2 100644 --- a/packages/backend/src/apps/clickup/dynamic-data/index.js +++ b/packages/backend/src/apps/clickup/dynamic-data/index.js @@ -1,5 +1,7 @@ import listFolders from './list-folders/index.js'; +import listLists from './list-lists/index.js'; import listSpaces from './list-spaces/index.js'; +import listTasks from './list-tasks/index.js'; import listWorkspaces from './list-workspaces/index.js'; -export default [listFolders, listSpaces, listWorkspaces]; +export default [listFolders, listLists, listSpaces, listTasks, listWorkspaces]; diff --git a/packages/backend/src/apps/clickup/dynamic-data/list-lists/index.js b/packages/backend/src/apps/clickup/dynamic-data/list-lists/index.js new file mode 100644 index 00000000..3bbd3088 --- /dev/null +++ b/packages/backend/src/apps/clickup/dynamic-data/list-lists/index.js @@ -0,0 +1,28 @@ +export default { + name: 'List lists', + key: 'listLists', + + async run($) { + const lists = { + data: [], + }; + const folderId = $.step.parameters.folderId; + + if (!folderId) { + return lists; + } + + const { data } = await $.http.get(`/v2/folder/${folderId}/list`); + + if (data.lists) { + for (const list of data.lists) { + lists.data.push({ + value: list.id, + name: list.name, + }); + } + } + + return lists; + }, +}; diff --git a/packages/backend/src/apps/clickup/dynamic-data/list-tasks/index.js b/packages/backend/src/apps/clickup/dynamic-data/list-tasks/index.js new file mode 100644 index 00000000..6f5b6916 --- /dev/null +++ b/packages/backend/src/apps/clickup/dynamic-data/list-tasks/index.js @@ -0,0 +1,41 @@ +export default { + name: 'List tasks', + key: 'listTasks', + + async run($) { + const tasks = { + data: [], + }; + const listId = $.step.parameters.listId; + let next = false; + + if (!listId) { + return tasks; + } + + const params = { + order_by: 'created', + reverse: true, + }; + + do { + const { data } = await $.http.get(`/v2/list/${listId}/task`, { params }); + if (data.last_page) { + next = false; + } else { + next = true; + } + + if (data.tasks) { + for (const task of data.tasks) { + tasks.data.push({ + value: task.id, + name: task.name, + }); + } + } + } while (next); + + return tasks; + }, +}; diff --git a/packages/backend/src/apps/clickup/triggers/index.js b/packages/backend/src/apps/clickup/triggers/index.js index c212564e..0e016d99 100644 --- a/packages/backend/src/apps/clickup/triggers/index.js +++ b/packages/backend/src/apps/clickup/triggers/index.js @@ -1,4 +1,5 @@ import newFolders from './new-folders/index.js'; import newLists from './new-lists/index.js'; +import newTasks from './new-tasks/index.js'; -export default [newFolders, newLists]; +export default [newFolders, newLists, newTasks]; diff --git a/packages/backend/src/apps/clickup/triggers/new-tasks/index.js b/packages/backend/src/apps/clickup/triggers/new-tasks/index.js new file mode 100644 index 00000000..3947b177 --- /dev/null +++ b/packages/backend/src/apps/clickup/triggers/new-tasks/index.js @@ -0,0 +1,186 @@ +import Crypto from 'crypto'; +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New tasks', + key: 'newTasks', + type: 'webhook', + description: 'Triggers when a new task 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}', + }, + ], + }, + }, + { + label: 'Folder', + key: 'folderId', + type: 'dropdown', + required: false, + dependsOn: ['parameters.spaceId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listFolders', + }, + { + name: 'parameters.spaceId', + value: '{parameters.spaceId}', + }, + ], + }, + }, + { + label: 'List', + key: 'listId', + type: 'dropdown', + required: false, + dependsOn: ['parameters.folderId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listLists', + }, + { + name: 'parameters.folderId', + value: '{parameters.folderId}', + }, + ], + }, + }, + { + label: 'Task', + key: 'taskId', + type: 'dropdown', + required: false, + dependsOn: ['parameters.listId'], + description: + 'Choose an optional task to determine when this flow should be activated. In this scenario, only subtasks will initiate this flow.', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listTasks', + }, + { + name: 'parameters.listId', + value: '{parameters.listId}', + }, + ], + }, + }, + ], + + async run($) { + const dataItem = { + raw: $.request.body, + meta: { + internalId: Crypto.randomUUID(), + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async testRun($) { + const sampleEventData = { + event: 'taskCreated', + task_id: '86enn7pg7', + webhook_id: $.webhookUrl.split('/')[5], + history_items: [], + }; + + const dataItem = { + raw: sampleEventData, + meta: { + internalId: sampleEventData.webhook_id, + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async registerHook($) { + const { workspaceId, spaceId, folderId, listId, taskId } = + $.step.parameters; + + const payload = { + name: $.flow.id, + endpoint: $.webhookUrl, + events: ['taskCreated'], + space_id: spaceId, + }; + + if (folderId) { + payload.folder_id = folderId; + } + + if (listId) { + payload.list_id = listId; + } + + if (taskId) { + payload.task_id = taskId; + } + + 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/apps/clickup/triggers.md b/packages/docs/pages/apps/clickup/triggers.md index eba5ba62..1635b2c6 100644 --- a/packages/docs/pages/apps/clickup/triggers.md +++ b/packages/docs/pages/apps/clickup/triggers.md @@ -5,6 +5,8 @@ items: desc: Triggers when a new folder is created. - name: New lists desc: Triggers when a new list is created. + - name: New tasks + desc: Triggers when a new task is created. ---