From bfcf54a26f015b5aa99875b1fe3cf8c25f83d1f7 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 13 Dec 2024 14:13:35 +0000 Subject: [PATCH] feat(signalwire): add receive call --- .../src/apps/signalwire/dynamic-data/index.js | 5 +- .../list-incoming-call-phone-numbers/index.js | 37 +++++++++ .../index.js | 4 +- .../src/apps/signalwire/triggers/index.js | 3 +- .../signalwire/triggers/receive-call/index.js | 82 +++++++++++++++++++ .../signalwire/triggers/receive-sms/index.js | 2 +- 6 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 packages/backend/src/apps/signalwire/dynamic-data/list-incoming-call-phone-numbers/index.js rename packages/backend/src/apps/signalwire/dynamic-data/{list-incoming-phone-numbers => list-incoming-sms-phone-numbers}/index.js (92%) create mode 100644 packages/backend/src/apps/signalwire/triggers/receive-call/index.js diff --git a/packages/backend/src/apps/signalwire/dynamic-data/index.js b/packages/backend/src/apps/signalwire/dynamic-data/index.js index 758d4abe..8c54ba23 100644 --- a/packages/backend/src/apps/signalwire/dynamic-data/index.js +++ b/packages/backend/src/apps/signalwire/dynamic-data/index.js @@ -1,3 +1,4 @@ -import listIncomingPhoneNumbers from './list-incoming-phone-numbers/index.js'; +import listIncomingSmsPhoneNumbers from './list-incoming-sms-phone-numbers/index.js'; +import listIncomingCallPhoneNumbers from './list-incoming-call-phone-numbers/index.js'; -export default [listIncomingPhoneNumbers]; +export default [listIncomingCallPhoneNumbers, listIncomingSmsPhoneNumbers]; diff --git a/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-call-phone-numbers/index.js b/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-call-phone-numbers/index.js new file mode 100644 index 00000000..93f3ded9 --- /dev/null +++ b/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-call-phone-numbers/index.js @@ -0,0 +1,37 @@ +export default { + name: 'List incoming call phone numbers', + key: 'listIncomingCallPhoneNumbers', + + async run($) { + let requestPath = `/api/laml/2010-04-01/Accounts/${$.auth.data.accountSid}/IncomingPhoneNumbers`; + + const aggregatedResponse = { + data: [], + }; + + do { + const { data } = await $.http.get(requestPath); + + const voiceCapableIncomingPhoneNumbers = data.incoming_phone_numbers + .filter((incomingPhoneNumber) => { + return incomingPhoneNumber.capabilities.voice; + }) + .map((incomingPhoneNumber) => { + const friendlyName = incomingPhoneNumber.friendly_name; + const phoneNumber = incomingPhoneNumber.phone_number; + const name = [friendlyName, phoneNumber].filter(Boolean).join(' - '); + + return { + value: incomingPhoneNumber.sid, + name, + }; + }); + + aggregatedResponse.data.push(...voiceCapableIncomingPhoneNumbers); + + requestPath = data.next_page_uri; + } while (requestPath); + + return aggregatedResponse; + }, +}; diff --git a/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.js b/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-sms-phone-numbers/index.js similarity index 92% rename from packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.js rename to packages/backend/src/apps/signalwire/dynamic-data/list-incoming-sms-phone-numbers/index.js index 72fa66a2..9a8129a7 100644 --- a/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.js +++ b/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-sms-phone-numbers/index.js @@ -1,6 +1,6 @@ export default { - name: 'List incoming phone numbers', - key: 'listIncomingPhoneNumbers', + name: 'List incoming SMS phone numbers', + key: 'listIncomingSmsPhoneNumbers', async run($) { let requestPath = `/api/laml/2010-04-01/Accounts/${$.auth.data.accountSid}/IncomingPhoneNumbers`; diff --git a/packages/backend/src/apps/signalwire/triggers/index.js b/packages/backend/src/apps/signalwire/triggers/index.js index c7219e50..9bdc78ba 100644 --- a/packages/backend/src/apps/signalwire/triggers/index.js +++ b/packages/backend/src/apps/signalwire/triggers/index.js @@ -1,3 +1,4 @@ +import receiveCall from './receive-call/index.js'; import receiveSms from './receive-sms/index.js'; -export default [receiveSms]; +export default [receiveCall, receiveSms]; diff --git a/packages/backend/src/apps/signalwire/triggers/receive-call/index.js b/packages/backend/src/apps/signalwire/triggers/receive-call/index.js new file mode 100644 index 00000000..8ef1ada6 --- /dev/null +++ b/packages/backend/src/apps/signalwire/triggers/receive-call/index.js @@ -0,0 +1,82 @@ +import { URLSearchParams } from 'node:url'; +import Crypto from 'node:crypto'; +import isEmpty from 'lodash/isEmpty.js'; +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'Receive Call', + key: 'receiveCall', + type: 'webhook', + description: 'Triggers when a new call is received.', + arguments: [ + { + label: 'To Number', + key: 'phoneNumberSid', + type: 'dropdown', + required: true, + description: + 'The number to receive the call on. It should be a SignalWire number in your project.', + variables: false, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listIncomingCallPhoneNumbers', + }, + ], + }, + }, + ], + + async run($) { + const dataItem = { + raw: $.request.body, + meta: { + internalId: Crypto.randomUUID(), + }, + }; + + $.pushTriggerItem(dataItem); + }, + + async testRun($) { + const lastExecutionStep = await $.getLastExecutionStep(); + + if (!isEmpty(lastExecutionStep?.dataOut)) { + $.pushTriggerItem({ + raw: lastExecutionStep.dataOut, + meta: { + internalId: '', + }, + }); + } + }, + + async registerHook($) { + const phoneNumberSid = $.step.parameters.phoneNumberSid; + + const payload = new URLSearchParams({ + VoiceUrl: $.webhookUrl, + }).toString(); + + await $.http.post( + `/2010-04-01/Accounts/${$.auth.data.accountSid}/IncomingPhoneNumbers/${phoneNumberSid}.json`, + payload + ); + }, + + async unregisterHook($) { + const phoneNumberSid = $.step.parameters.phoneNumberSid; + + const payload = new URLSearchParams({ + VoiceUrl: '', + }).toString(); + + await $.http.post( + `/2010-04-01/Accounts/${$.auth.data.accountSid}/IncomingPhoneNumbers/${phoneNumberSid}.json`, + payload + ); + }, +}); diff --git a/packages/backend/src/apps/signalwire/triggers/receive-sms/index.js b/packages/backend/src/apps/signalwire/triggers/receive-sms/index.js index d71ab762..ee8465e2 100644 --- a/packages/backend/src/apps/signalwire/triggers/receive-sms/index.js +++ b/packages/backend/src/apps/signalwire/triggers/receive-sms/index.js @@ -20,7 +20,7 @@ export default defineTrigger({ arguments: [ { name: 'key', - value: 'listIncomingPhoneNumbers', + value: 'listIncomingSmsPhoneNumbers', }, ], },