diff --git a/packages/backend/src/apps/signalwire/actions/send-sms/index.ts b/packages/backend/src/apps/signalwire/actions/send-sms/index.ts index 5ce3d379..0c6db616 100644 --- a/packages/backend/src/apps/signalwire/actions/send-sms/index.ts +++ b/packages/backend/src/apps/signalwire/actions/send-sms/index.ts @@ -8,11 +8,21 @@ export default defineAction({ { label: 'From Number', key: 'fromNumber', - type: 'string' as const, + type: 'dropdown' as const, required: true, description: 'The number to send the SMS from. Include only country code. Example: 491234567890', variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listIncomingPhoneNumbers', + }, + ], + }, }, { label: 'To Number', diff --git a/packages/backend/src/apps/signalwire/dynamic-data/index.ts b/packages/backend/src/apps/signalwire/dynamic-data/index.ts new file mode 100644 index 00000000..d20d4347 --- /dev/null +++ b/packages/backend/src/apps/signalwire/dynamic-data/index.ts @@ -0,0 +1,3 @@ +import listIncomingPhoneNumbers from './list-incoming-phone-numbers'; + +export default [listIncomingPhoneNumbers]; diff --git a/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.ts b/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.ts new file mode 100644 index 00000000..b5f4a97e --- /dev/null +++ b/packages/backend/src/apps/signalwire/dynamic-data/list-incoming-phone-numbers/index.ts @@ -0,0 +1,58 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; + +type TAggregatedResponse = { + data: IJSONObject[]; + error?: IJSONObject; +}; + +type TResponse = { + incoming_phone_numbers: TIncomingPhoneNumber[]; + next_page_uri: string; +}; + +type TIncomingPhoneNumber = { + capabilities: { + sms: boolean; + }; + sid: string; + friendly_name: string; + phone_number: string; +}; + +export default { + name: 'List incoming phone numbers', + key: 'listIncomingPhoneNumbers', + + async run($: IGlobalVariable) { + let requestPath = `/api/laml/2010-04-01/Accounts/${$.auth.data.accountSid}/IncomingPhoneNumbers`; + + const aggregatedResponse: TAggregatedResponse = { + data: [], + }; + + do { + const { data } = await $.http.get(requestPath); + + const smsCapableIncomingPhoneNumbers = data.incoming_phone_numbers + .filter((incomingPhoneNumber) => { + return incomingPhoneNumber.capabilities.sms; + }) + .map((incomingPhoneNumber) => { + const friendlyName = incomingPhoneNumber.friendly_name; + const phoneNumber = incomingPhoneNumber.phone_number; + const sid = incomingPhoneNumber.sid; + const name = [friendlyName, phoneNumber].filter(Boolean).join(' - '); + + return { + value: sid, + name, + }; + }) + aggregatedResponse.data.push(...smsCapableIncomingPhoneNumbers) + + requestPath = data.next_page_uri; + } while (requestPath); + + return aggregatedResponse; + }, +}; diff --git a/packages/backend/src/apps/signalwire/index.ts b/packages/backend/src/apps/signalwire/index.ts index 9d187669..658a9a90 100644 --- a/packages/backend/src/apps/signalwire/index.ts +++ b/packages/backend/src/apps/signalwire/index.ts @@ -3,6 +3,7 @@ import addAuthHeader from './common/add-auth-header'; import auth from './auth'; import triggers from './triggers'; import actions from './actions'; +import dynamicData from './dynamic-data'; export default defineApp({ name: 'SignalWire', @@ -17,4 +18,5 @@ export default defineApp({ auth, triggers, actions, + dynamicData, }); diff --git a/packages/backend/src/apps/signalwire/triggers/receive-sms/index.ts b/packages/backend/src/apps/signalwire/triggers/receive-sms/index.ts index 3398d9a0..896244fa 100644 --- a/packages/backend/src/apps/signalwire/triggers/receive-sms/index.ts +++ b/packages/backend/src/apps/signalwire/triggers/receive-sms/index.ts @@ -10,10 +10,20 @@ export default defineTrigger({ { label: 'To Number', key: 'toNumber', - type: 'string', + type: 'dropdown', required: true, description: 'The number to receive the SMS on. It should be a SignalWire number in your project.', + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listIncomingPhoneNumbers', + }, + ], + }, }, ],