From ef087be4f07ece03052fce6e18f6f01bbb30dd93 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 6 Oct 2023 16:07:34 +0200 Subject: [PATCH] feat(placetel): Add hungup call trigger --- .../src/apps/placetel/dynamic-data/index.ts | 3 + .../dynamic-data/list-numbers/index.ts | 31 ++++++ packages/backend/src/apps/placetel/index.ts | 4 + .../placetel/triggers/hungup-call/index.ts | 97 +++++++++++++++++++ .../src/apps/placetel/triggers/index.ts | 3 + 5 files changed, 138 insertions(+) create mode 100644 packages/backend/src/apps/placetel/dynamic-data/index.ts create mode 100644 packages/backend/src/apps/placetel/dynamic-data/list-numbers/index.ts create mode 100644 packages/backend/src/apps/placetel/triggers/hungup-call/index.ts create mode 100644 packages/backend/src/apps/placetel/triggers/index.ts diff --git a/packages/backend/src/apps/placetel/dynamic-data/index.ts b/packages/backend/src/apps/placetel/dynamic-data/index.ts new file mode 100644 index 00000000..819a758d --- /dev/null +++ b/packages/backend/src/apps/placetel/dynamic-data/index.ts @@ -0,0 +1,3 @@ +import listNumbers from './list-numbers'; + +export default [listNumbers]; diff --git a/packages/backend/src/apps/placetel/dynamic-data/list-numbers/index.ts b/packages/backend/src/apps/placetel/dynamic-data/list-numbers/index.ts new file mode 100644 index 00000000..c3dff3a7 --- /dev/null +++ b/packages/backend/src/apps/placetel/dynamic-data/list-numbers/index.ts @@ -0,0 +1,31 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +export default { + name: 'List numbers', + key: 'listNumbers', + + async run($: IGlobalVariable) { + const numbers: { + data: IJSONObject[]; + } = { + data: [], + }; + + const { data } = await $.http.get('/v2/numbers'); + + if (!data) { + return { data: [] }; + } + + if (data.length) { + for (const number of data) { + numbers.data.push({ + value: number.number, + name: number.number, + }); + } + } + + return numbers; + }, +}; diff --git a/packages/backend/src/apps/placetel/index.ts b/packages/backend/src/apps/placetel/index.ts index c8cdeb2d..f682ea26 100644 --- a/packages/backend/src/apps/placetel/index.ts +++ b/packages/backend/src/apps/placetel/index.ts @@ -1,6 +1,8 @@ import defineApp from '../../helpers/define-app'; import addAuthHeader from './common/add-auth-header'; import auth from './auth'; +import triggers from './triggers'; +import dynamicData from './dynamic-data'; export default defineApp({ name: 'Placetel', @@ -13,4 +15,6 @@ export default defineApp({ primaryColor: '069dd9', beforeRequest: [addAuthHeader], auth, + triggers, + dynamicData, }); diff --git a/packages/backend/src/apps/placetel/triggers/hungup-call/index.ts b/packages/backend/src/apps/placetel/triggers/hungup-call/index.ts new file mode 100644 index 00000000..a88abd87 --- /dev/null +++ b/packages/backend/src/apps/placetel/triggers/hungup-call/index.ts @@ -0,0 +1,97 @@ +import { IJSONObject } from '@automatisch/types'; +import defineTrigger from '../../../../helpers/define-trigger'; + +export default defineTrigger({ + name: 'Hungup Call', + key: 'hungupCall', + type: 'webhook', + description: 'Triggers when a call is hungup.', + arguments: [ + { + label: 'Numbers', + key: 'numbers', + type: 'dynamic' as const, + required: false, + description: '', + fields: [ + { + label: 'Number', + key: 'number', + type: 'dropdown' as const, + required: true, + description: + 'Filter events by number. If the numbers are not specified, all numbers will be notified.', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listNumbers', + }, + ], + }, + }, + ], + }, + ], + + async testRun($) { + const response = await $.http.get('/v2/calls?order=desc'); + + if (!response?.data) { + return; + } + + const lastCall = response.data[0]; + + const computedWebhookEvent = { + type: lastCall.type, + duration: lastCall.duration, + from: lastCall.from_number, + to: lastCall.to_number.number.number, + call_id: lastCall.id.toString(), + event: 'HungUp', + direction: 'in', + }; + + const dataItem = { + raw: computedWebhookEvent, + meta: { + internalId: computedWebhookEvent.call_id.toString(), + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async registerHook($) { + const numbers = ($.step.parameters.numbers as IJSONObject[]) + .map((number: IJSONObject) => number.number) + .filter(Boolean); + + const subscriptionPayload = { + service: 'string', + url: $.webhookUrl, + incoming: false, + outgoing: false, + hungup: true, + accepted: false, + phone: false, + numbers, + }; + + const headers = { + 'Content-Type': 'application/json', + }; + + const { data } = await $.http.put('/v2/subscriptions', subscriptionPayload); + + await $.flow.setRemoteWebhookId(data.id); + }, + + async unregisterHook($) { + await $.http.delete(`/v2/subscriptions/${$.flow.remoteWebhookId}`); + }, +}); diff --git a/packages/backend/src/apps/placetel/triggers/index.ts b/packages/backend/src/apps/placetel/triggers/index.ts new file mode 100644 index 00000000..9a8974d8 --- /dev/null +++ b/packages/backend/src/apps/placetel/triggers/index.ts @@ -0,0 +1,3 @@ +import hungupCall from './hungup-call'; + +export default [hungupCall];