From 4f538ca2fced44e5eca9075fff2b5dc28a8947a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Wed, 22 Nov 2023 18:02:28 +0300 Subject: [PATCH] feat(zendesk): add new tickets trigger --- .../src/apps/zendesk/dynamic-data/index.ts | 2 + .../zendesk/dynamic-data/list-views/index.ts | 38 ++++++++++++ packages/backend/src/apps/zendesk/index.ts | 2 + .../src/apps/zendesk/triggers/index.ts | 3 + .../zendesk/triggers/new-tickets/index.ts | 59 +++++++++++++++++++ packages/docs/pages/apps/zendesk/triggers.md | 12 ++++ 6 files changed, 116 insertions(+) create mode 100644 packages/backend/src/apps/zendesk/dynamic-data/list-views/index.ts create mode 100644 packages/backend/src/apps/zendesk/triggers/index.ts create mode 100644 packages/backend/src/apps/zendesk/triggers/new-tickets/index.ts create mode 100644 packages/docs/pages/apps/zendesk/triggers.md diff --git a/packages/backend/src/apps/zendesk/dynamic-data/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/index.ts index 4cd089e7..de4720f9 100644 --- a/packages/backend/src/apps/zendesk/dynamic-data/index.ts +++ b/packages/backend/src/apps/zendesk/dynamic-data/index.ts @@ -3,6 +3,7 @@ import listBrands from './list-brands'; import listGroups from './list-groups'; import listSharingAgreements from './list-sharing-agreements'; import listTicketForms from './list-ticket-forms'; +import listViews from './list-views'; export default [ listUsers, @@ -10,4 +11,5 @@ export default [ listGroups, listSharingAgreements, listTicketForms, + listViews, ]; diff --git a/packages/backend/src/apps/zendesk/dynamic-data/list-views/index.ts b/packages/backend/src/apps/zendesk/dynamic-data/list-views/index.ts new file mode 100644 index 00000000..3c7d94b7 --- /dev/null +++ b/packages/backend/src/apps/zendesk/dynamic-data/list-views/index.ts @@ -0,0 +1,38 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +export default { + name: 'List views', + key: 'listViews', + + async run($: IGlobalVariable) { + const views: { + data: IJSONObject[]; + } = { + data: [], + }; + let hasMore; + + const params = { + 'page[size]': 100, + 'page[after]': undefined as unknown as string, + }; + + do { + const response = await $.http.get('/api/v2/views', { params }); + const allViews = response?.data?.views; + hasMore = response?.data?.meta?.has_more; + params['page[after]'] = response.data.meta?.after_cursor; + + if (allViews?.length) { + for (const view of allViews) { + views.data.push({ + value: view.id, + name: view.title, + }); + } + } + } while (hasMore); + + return views; + }, +}; diff --git a/packages/backend/src/apps/zendesk/index.ts b/packages/backend/src/apps/zendesk/index.ts index 54810011..a0e5e6a7 100644 --- a/packages/backend/src/apps/zendesk/index.ts +++ b/packages/backend/src/apps/zendesk/index.ts @@ -1,6 +1,7 @@ import defineApp from '../../helpers/define-app'; import addAuthHeader from './common/add-auth-headers'; import auth from './auth'; +import triggers from './triggers'; import actions from './actions'; import dynamicData from './dynamic-data'; @@ -15,6 +16,7 @@ export default defineApp({ supportsConnections: true, beforeRequest: [addAuthHeader], auth, + triggers, actions, dynamicData, }); diff --git a/packages/backend/src/apps/zendesk/triggers/index.ts b/packages/backend/src/apps/zendesk/triggers/index.ts new file mode 100644 index 00000000..1c47e6b5 --- /dev/null +++ b/packages/backend/src/apps/zendesk/triggers/index.ts @@ -0,0 +1,3 @@ +import newTickets from './new-tickets'; + +export default [newTickets]; diff --git a/packages/backend/src/apps/zendesk/triggers/new-tickets/index.ts b/packages/backend/src/apps/zendesk/triggers/new-tickets/index.ts new file mode 100644 index 00000000..9a7d1a63 --- /dev/null +++ b/packages/backend/src/apps/zendesk/triggers/new-tickets/index.ts @@ -0,0 +1,59 @@ +import defineTrigger from '../../../../helpers/define-trigger'; + +export default defineTrigger({ + name: 'New tickets', + key: 'newTickets', + pollInterval: 15, + description: 'Triggers when a new ticket is created in a specific view.', + arguments: [ + { + label: 'View', + key: 'viewId', + type: 'dropdown' as const, + required: true, + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listViews', + }, + ], + }, + }, + ], + + async run($) { + const viewId = $.step.parameters.viewId; + + const params = { + 'page[size]': 100, + 'page[after]': undefined as unknown as string, + sort_by: 'nice_id', + sort_order: 'desc', + }; + let hasMore; + + do { + const response = await $.http.get(`/api/v2/views/${viewId}/tickets`, { + params, + }); + const allTickets = response?.data?.tickets; + hasMore = response?.data?.meta?.has_more; + params['page[after]'] = response.data.meta?.after_cursor; + + if (allTickets?.length) { + for (const ticket of allTickets) { + $.pushTriggerItem({ + raw: ticket, + meta: { + internalId: ticket.id.toString(), + }, + }); + } + } + } while (hasMore); + }, +}); diff --git a/packages/docs/pages/apps/zendesk/triggers.md b/packages/docs/pages/apps/zendesk/triggers.md new file mode 100644 index 00000000..6b286305 --- /dev/null +++ b/packages/docs/pages/apps/zendesk/triggers.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/zendesk.svg +items: + - name: New tickets + desc: Triggers when a new ticket is created in a specific view. +--- + + + +