new-call.ts•5.33 kB
import { createTrigger, TriggerStrategy, PiecePropValueSchema } from '@activepieces/pieces-framework';
import { twilioAuth } from '../..';
import { AuthenticationType, DedupeStrategy, httpClient, HttpMethod, Polling, pollingHelper } from '@activepieces/pieces-common';
interface Call {
sid: string;
status: string;
direction: string;
from: string;
to: string;
start_time: string;
end_time: string;
duration: string;
price: string;
price_unit: string;
date_created:string
}
interface CallsResponse {
calls: Call[];
next_page_uri:string
}
const polling: Polling<
PiecePropValueSchema<typeof twilioAuth>,
Record<string, unknown>
> = {
strategy: DedupeStrategy.TIMEBASED,
async items({ auth, lastFetchEpochMS }) {
const isTest = lastFetchEpochMS === 0;
const account_sid = auth.username;
const auth_token = auth.password;
let currentUri:
| string
| null = `/2010-04-01/Accounts/${account_sid}/Calls.json?PageSize=${
isTest ? 1 : 1000
}`;
const results = [];
let stop = false;
do {
const response: any = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `https://api.twilio.com${currentUri}`,
authentication: {
type: AuthenticationType.BASIC,
username: account_sid,
password: auth_token,
},
});
const payload = response.body as CallsResponse;
const calls = payload.calls ?? [];
for (const call of calls) {
const ts = new Date(call.date_created).getTime();
if(call.status !== 'completed') continue;
if (isTest || ts > lastFetchEpochMS) {
results.push(call);
} else {
stop = true;
break;
}
}
if (isTest) break;
currentUri = payload?.next_page_uri ?? null;
} while (currentUri && !stop);
return results.map((call) => {
return {
epochMilliSeconds: new Date(call.date_created).getTime(),
data: call,
};
});
},
};
export const twilioNewCall = createTrigger({
auth: twilioAuth,
name: 'new_call',
displayName: 'New Call',
description: 'Triggers when a call completes (incoming or outgoing).',
props: {},
sampleData:{
"account_sid": "ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"answered_by": "machine_start",
"api_version": "2010-04-01",
"caller_name": "callerid1",
"date_created": "Fri, 18 Oct 2019 17:00:00 +0000",
"date_updated": "Fri, 18 Oct 2019 17:01:00 +0000",
"direction": "outbound-api",
"duration": "4",
"end_time": "Fri, 18 Oct 2019 17:03:00 +0000",
"forwarded_from": "calledvia1",
"from": "+13051416799",
"from_formatted": "(305) 141-6799",
"group_sid": "GPdeadbeefdeadbeefdeadbeefdeadbeef",
"parent_call_sid": "CAdeadbeefdeadbeefdeadbeefdeadbeef",
"phone_number_sid": "PNdeadbeefdeadbeefdeadbeefdeadbeef",
"price": "-0.200",
"price_unit": "USD",
"sid": "CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"start_time": "Fri, 18 Oct 2019 17:02:00 +0000",
"status": "completed",
"subresource_uris": {
"notifications": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Notifications.json",
"recordings": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Recordings.json",
"payments": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Payments.json",
"events": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Events.json",
"siprec": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Siprec.json",
"streams": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Streams.json",
"transcriptions": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Transcriptions.json",
"user_defined_message_subscriptions": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/UserDefinedMessageSubscriptions.json",
"user_defined_messages": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/UserDefinedMessages.json"
},
"to": "+13051913581",
"to_formatted": "(305) 191-3581",
"trunk_sid": "TKdeadbeefdeadbeefdeadbeefdeadbeef",
"uri": "/2010-04-01/Accounts/ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Calls/CAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.json",
"queue_time": "1000"
},
type: TriggerStrategy.POLLING,
async onEnable(context) {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async onDisable(context) {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async test(context) {
return await pollingHelper.test(polling, context);
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
});