diff --git a/packages/backend/src/apps/trello/actions/create-card/index.ts b/packages/backend/src/apps/trello/actions/create-card/index.ts new file mode 100644 index 00000000..fbd1ab81 --- /dev/null +++ b/packages/backend/src/apps/trello/actions/create-card/index.ts @@ -0,0 +1,189 @@ +import { IJSONArray, IJSONObject } from '@automatisch/types'; +import defineAction from '../../../../helpers/define-action'; + +export default defineAction({ + name: 'Create card', + key: 'createCard', + description: 'Creates a new card within a specified board and list.', + arguments: [ + { + label: 'Board', + key: 'boardId', + type: 'dropdown' as const, + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listBoards', + }, + ], + }, + }, + { + label: 'List', + key: 'listId', + type: 'dropdown' as const, + required: true, + dependsOn: ['parameters.boardId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listBoardLists', + }, + { + name: 'parameters.boardId', + value: '{parameters.boardId}', + }, + ], + }, + }, + { + label: 'Name', + key: 'name', + type: 'string' as const, + required: true, + variables: true, + description: '', + }, + { + label: 'Description', + key: 'description', + type: 'string' as const, + required: false, + variables: true, + description: '', + }, + + { + label: 'Label', + key: 'label', + type: 'dropdown' as const, + required: false, + dependsOn: ['parameters.boardId'], + description: 'Select a color tag to attach to the card.', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listBoardLabels', + }, + { + name: 'parameters.boardId', + value: '{parameters.boardId}', + }, + ], + }, + }, + { + label: 'Card Position', + key: 'cardPosition', + type: 'dropdown' as const, + required: false, + description: '', + variables: true, + options: [ + { + label: 'top', + value: 'top', + }, + { + label: 'bottom', + value: 'bottom', + }, + ], + }, + { + label: 'Members', + key: 'memberIds', + type: 'dynamic' as const, + required: false, + description: '', + fields: [ + { + label: 'Member', + key: 'memberId', + type: 'dropdown' as const, + required: false, + dependsOn: ['parameters.boardId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listMembers', + }, + { + name: 'parameters.boardId', + value: '{parameters.boardId}', + }, + ], + }, + }, + ], + }, + { + label: 'Due Date', + key: 'dueDate', + type: 'string' as const, + required: false, + variables: true, + description: 'Format: mm-dd-yyyy HH:mm:ss or yyyy-MM-dd HH:mm:ss.', + }, + { + label: 'URL Attachment', + key: 'urlSource', + type: 'string' as const, + required: false, + variables: true, + description: 'A URL to attach to the card.', + }, + ], + + async run($) { + const { + listId, + name, + description, + cardPosition, + dueDate, + label, + urlSource, + } = $.step.parameters; + + const memberIds = $.step.parameters.memberIds as IJSONArray; + const idMembers = memberIds.map( + (memberId: IJSONObject) => memberId.memberId + ); + + const fields = { + name, + desc: description, + idList: listId, + pos: cardPosition, + due: dueDate, + idMembers: idMembers.join(','), + idLabels: label, + urlSource, + }; + + const response = await $.http.post('/1/cards', fields); + + $.setActionItem({ raw: response.data }); + }, +}); diff --git a/packages/backend/src/apps/trello/actions/index.ts b/packages/backend/src/apps/trello/actions/index.ts new file mode 100644 index 00000000..90c37fb0 --- /dev/null +++ b/packages/backend/src/apps/trello/actions/index.ts @@ -0,0 +1,3 @@ +import createCard from './create-card'; + +export default [createCard]; diff --git a/packages/backend/src/apps/trello/common/add-auth-header.ts b/packages/backend/src/apps/trello/common/add-auth-header.ts index 95cce958..22e2c540 100644 --- a/packages/backend/src/apps/trello/common/add-auth-header.ts +++ b/packages/backend/src/apps/trello/common/add-auth-header.ts @@ -5,6 +5,8 @@ const addAuthHeader: TBeforeRequest = ($, requestConfig) => { requestConfig.headers.Authorization = `OAuth oauth_consumer_key="${$.auth.data.apiKey}", oauth_token="${$.auth.data.token}"`; } + requestConfig.headers.Accept = 'application/json'; + return requestConfig; }; diff --git a/packages/backend/src/apps/trello/dynamic-data/index.ts b/packages/backend/src/apps/trello/dynamic-data/index.ts new file mode 100644 index 00000000..232aa556 --- /dev/null +++ b/packages/backend/src/apps/trello/dynamic-data/index.ts @@ -0,0 +1,6 @@ +import listBoardLabels from './list-board-labels'; +import listBoardLists from './list-board-lists'; +import listBoards from './list-boards'; +import listMembers from './listMembers'; + +export default [listBoardLabels, listBoardLists, listBoards, listMembers]; diff --git a/packages/backend/src/apps/trello/dynamic-data/list-board-labels/index.ts b/packages/backend/src/apps/trello/dynamic-data/list-board-labels/index.ts new file mode 100644 index 00000000..a6cac58d --- /dev/null +++ b/packages/backend/src/apps/trello/dynamic-data/list-board-labels/index.ts @@ -0,0 +1,39 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +export default { + name: 'List board labels', + key: 'listBoardLabels', + + async run($: IGlobalVariable) { + const boardLabels: { + data: IJSONObject[]; + } = { + data: [], + }; + + const boardId = $.step.parameters.boardId; + + if (!boardId) { + return boardLabels; + } + + const params = { + fields: 'color', + }; + + const { data } = await $.http.get(`/1/boards/${boardId}/labels`, { + params, + }); + + if (data?.length) { + for (const boardLabel of data) { + boardLabels.data.push({ + value: boardLabel.id, + name: boardLabel.color, + }); + } + } + + return boardLabels; + }, +}; diff --git a/packages/backend/src/apps/trello/dynamic-data/list-board-lists/index.ts b/packages/backend/src/apps/trello/dynamic-data/list-board-lists/index.ts new file mode 100644 index 00000000..fe22c10c --- /dev/null +++ b/packages/backend/src/apps/trello/dynamic-data/list-board-lists/index.ts @@ -0,0 +1,33 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +export default { + name: 'List board lists', + key: 'listBoardLists', + + async run($: IGlobalVariable) { + const boards: { + data: IJSONObject[]; + } = { + data: [], + }; + + const boardId = $.step.parameters.boardId; + + if (!boardId) { + return boards; + } + + const { data } = await $.http.get(`/1/boards/${boardId}/lists`); + + if (data?.length) { + for (const list of data) { + boards.data.push({ + value: list.id, + name: list.name, + }); + } + } + + return boards; + }, +}; diff --git a/packages/backend/src/apps/trello/dynamic-data/list-boards/index.ts b/packages/backend/src/apps/trello/dynamic-data/list-boards/index.ts new file mode 100644 index 00000000..83749839 --- /dev/null +++ b/packages/backend/src/apps/trello/dynamic-data/list-boards/index.ts @@ -0,0 +1,27 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +export default { + name: 'List boards', + key: 'listBoards', + + async run($: IGlobalVariable) { + const boards: { + data: IJSONObject[]; + } = { + data: [], + }; + + const { data } = await $.http.get(`/1/members/me/boards`); + + if (data?.length) { + for (const board of data) { + boards.data.push({ + value: board.id, + name: board.name, + }); + } + } + + return boards; + }, +}; diff --git a/packages/backend/src/apps/trello/dynamic-data/listMembers/index.ts b/packages/backend/src/apps/trello/dynamic-data/listMembers/index.ts new file mode 100644 index 00000000..3070f542 --- /dev/null +++ b/packages/backend/src/apps/trello/dynamic-data/listMembers/index.ts @@ -0,0 +1,33 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +export default { + name: 'List members', + key: 'listMembers', + + async run($: IGlobalVariable) { + const members: { + data: IJSONObject[]; + } = { + data: [], + }; + + const boardId = $.step.parameters.boardId; + + if (!boardId) { + return members; + } + + const { data } = await $.http.get(`/1/boards/${boardId}/members`); + + if (data?.length) { + for (const member of data) { + members.data.push({ + value: member.id, + name: member.fullName, + }); + } + } + + return members; + }, +}; diff --git a/packages/backend/src/apps/trello/index.ts b/packages/backend/src/apps/trello/index.ts index e6b54d85..93552675 100644 --- a/packages/backend/src/apps/trello/index.ts +++ b/packages/backend/src/apps/trello/index.ts @@ -1,6 +1,8 @@ import defineApp from '../../helpers/define-app'; import addAuthHeader from './common/add-auth-header'; import auth from './auth'; +import actions from './actions'; +import dynamicData from './dynamic-data'; export default defineApp({ name: 'Trello', @@ -13,4 +15,6 @@ export default defineApp({ primaryColor: '0079bf', beforeRequest: [addAuthHeader], auth, + actions, + dynamicData, }); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index 9cf6b113..15e92517 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -377,7 +377,10 @@ export default defineConfig({ text: 'Trello', collapsible: true, collapsed: true, - items: [{ text: 'Connection', link: '/apps/trello/connection' }], + items: [ + { text: 'Actions', link: '/apps/trello/actions' }, + { text: 'Connection', link: '/apps/trello/connection' }, + ], }, { text: 'Twilio', @@ -439,9 +442,7 @@ export default defineConfig({ text: 'Zendesk', collapsible: true, collapsed: true, - items: [ - { text: 'Connection', link: '/apps/zendesk/connection' }, - ], + items: [{ text: 'Connection', link: '/apps/zendesk/connection' }], }, ], '/': [ diff --git a/packages/docs/pages/apps/trello/actions.md b/packages/docs/pages/apps/trello/actions.md new file mode 100644 index 00000000..8ece515f --- /dev/null +++ b/packages/docs/pages/apps/trello/actions.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/trello.svg +items: + - name: Create card + desc: Creates a new card within a specified board and list. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index b6f2d901..cda867be 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -39,6 +39,7 @@ The following integrations are currently supported by Automatisch. - [Stripe](/apps/stripe/triggers) - [Telegram](/apps/telegram-bot/actions) - [Todoist](/apps/todoist/triggers) +- [Trello](/apps/trello/actions) - [Twilio](/apps/twilio/triggers) - [Twitter](/apps/twitter/triggers) - [Typeform](/apps/typeform/triggers)