Skip to content
This repository has been archived by the owner on Nov 19, 2019. It is now read-only.

Commit

Permalink
TaskRouter Classes
Browse files Browse the repository at this point in the history
Lookups Classes
Forked List - Next Gen List Support
Forked Client - New URL Endpoints TaskRouter, Lookups.
Defect Fix - SetRequestAccountSid on all Legacy List Classes.
Added new TwiML verbs for TaskRouter
Added Test Classes

Updated version to 3.3
  • Loading branch information
Henry Hai committed Apr 8, 2015
1 parent e15ee2a commit 4e6feec
Show file tree
Hide file tree
Showing 67 changed files with 3,375 additions and 2,651 deletions.
29 changes: 27 additions & 2 deletions src/classes/TwilioAPI.cls
Expand Up @@ -47,7 +47,9 @@ global class TwilioAPI {
private class MissingTwilioConfigCustomSettingsException extends Exception {}

private static TwilioRestClient client;

private static TwilioTRRestClient trClient;
private static TwilioLookupsRestClient lookupsClient;

private TwilioAPI() {}

/**
Expand All @@ -60,7 +62,29 @@ global class TwilioAPI {
}
return TwilioAPI.client;
}


/**
* Get a TwilioTRRestClient pre-populated with your TwilioConfig credentials
*/
public static TwilioTRRestClient getDefaultTRClient() {
if (trClient==null) {
TwilioConfig__c twilioCfg = getTwilioConfig();
TwilioAPI.trClient = new TwilioTRRestClient(twilioCfg.AccountSid__c, twilioCfg.AuthToken__c);
}
return TwilioAPI.trClient;
}

/**
* Get a TwilioLookupsRestClient pre-populated with your TwilioConfig credentials
*/
public static TwilioLookupsRestClient getDefaultLookupsClient() {
if (lookupsClient==null) {
TwilioConfig__c twilioCfg = getTwilioConfig();
TwilioAPI.lookupsClient = new TwilioLookupsRestClient(twilioCfg.AccountSid__c, twilioCfg.AuthToken__c);
}
return TwilioAPI.lookupsClient;
}

/**
* Get your primary account using your TwilioConfig credentials
*/
Expand All @@ -86,6 +110,7 @@ global class TwilioAPI {
return new TwilioTRCapability(twilioCfg.AccountSid__c, twilioCfg.AuthToken__c, workspaceSid, workerSid);
}


/**
* Get a new TwilioRestClient authorized with the credentials provided
*/
Expand Down
159 changes: 37 additions & 122 deletions src/classes/TwilioAccount.cls

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions src/classes/TwilioAccountList.cls
Expand Up @@ -50,9 +50,9 @@ global class TwilioAccountList extends TwilioResource.ListResource
}

/* implements method from TwilioResource.ListResource */
public override Object makeNew(TwilioRestClient client,
public override Object makeNew(TwilioClient client,
Map<String, Object> params) {
return new TwilioAccount(client, params);
return new TwilioAccount((TwilioRestClient)client, params);
}

/* implements method from TwilioResource.ListResource */
Expand Down
9 changes: 5 additions & 4 deletions src/classes/TwilioApplicationList.cls
Expand Up @@ -58,9 +58,10 @@ global class TwilioApplicationList extends TwilioResource.ListResource
/*
* see TwilioResource.ListResource#makeNew()
*/
public override Object makeNew(TwilioRestClient client,
Map<String, Object> params) {
return new TwilioApplication(client, params);
public override Object makeNew(TwilioClient client, Map<String, Object> params) {
TwilioApplication application = new TwilioApplication((TwilioRestClient)client, params);
application.setRequestAccountSid(this.getRequestAccountSid());
return application;
}

/*
Expand Down Expand Up @@ -96,7 +97,7 @@ global class TwilioApplicationList extends TwilioResource.ListResource
* @throws TwilioRestException the twilio rest exception
*/
public boolean deleteResource(String sid) {
TwilioAccount requestAccount = getClient().getAccount(getRequestAccountSid());
TwilioAccount requestAccount = ((TwilioRestClient)getClient()).getAccount(getRequestAccountSid());
TwilioApplication app = requestAccount.getApplication(sid);
return app.deleteResource();
}
Expand Down
7 changes: 4 additions & 3 deletions src/classes/TwilioAuthorizedConnectAppList.cls
Expand Up @@ -66,9 +66,10 @@ global class TwilioAuthorizedConnectAppList extends TwilioResource.ListResource
/*
* see TwilioResource.ListResource#makeNew(TwilioRestClient, Map)
*/
public override Object makeNew(TwilioRestClient client,
Map<String, Object> params) {
return new TwilioAuthorizedConnectApp(client, params);
public override Object makeNew(TwilioClient client, Map<String, Object> params) {
TwilioAuthorizedConnectApp connectApp = new TwilioAuthorizedConnectApp((TwilioRestClient)client, params);
connectApp.setRequestAccountSid(this.getRequestAccountSid());
return connectApp;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/classes/TwilioAvailablePhoneNumber.cls
Expand Up @@ -148,7 +148,7 @@ global class TwilioAvailablePhoneNumber extends TwilioResource.InstanceResource
Map<String,String> props = new Map<String,String>();
props.put('PhoneNumber', getPhoneNumber());

TwilioAccount requestAccount = getClient().getAccount(getRequestAccountSid());
TwilioAccount requestAccount = ((TwilioRestClient)getClient()).getAccount(getRequestAccountSid());
TwilioIncomingPhoneNumber incoming = requestAccount.getIncomingPhoneNumbers().create(props);
this.purchased = true;
return incoming;
Expand Down
7 changes: 4 additions & 3 deletions src/classes/TwilioAvailablePhoneNumberList.cls
Expand Up @@ -89,9 +89,10 @@ global class TwilioAvailablePhoneNumberList extends TwilioResource.ListResource
}

/* implements method from TwilioResource.ListResource */
public override Object makeNew(TwilioRestClient client,
Map<String, Object> params) {
return new TwilioAvailablePhoneNumber(client, params);
public override Object makeNew(TwilioClient client, Map<String, Object> params) {
TwilioAvailablePhoneNumber available = new TwilioAvailablePhoneNumber((TwilioRestClient)client, params);
available.setRequestAccountSid(this.getRequestAccountSid());
return available;
}

/* implements method from TwilioResource.ListResource */
Expand Down
27 changes: 22 additions & 5 deletions src/classes/TwilioCall.cls
Expand Up @@ -190,13 +190,13 @@ global class TwilioCall extends TwilioResource.InstanceResource {
}

public TwilioNotificationList getNotifications() {
TwilioNotificationList twlist = new TwilioNotificationList(this.getClient(), this.getSid());
TwilioNotificationList twlist = new TwilioNotificationList((TwilioRestClient)this.getClient(), this.getSid());
twlist.setRequestAccountSid(this.getRequestAccountSid());
return twlist;
}

public TwilioRecordingList getRecordings() {
TwilioRecordingList twlist = new TwilioRecordingList(this.getClient(), this.getSid());
TwilioRecordingList twlist = new TwilioRecordingList((TwilioRestClient)this.getClient(), this.getSid());
twlist.setRequestAccountSid(this.getRequestAccountSid());
return twlist;
}
Expand All @@ -223,7 +223,7 @@ global class TwilioCall extends TwilioResource.InstanceResource {
TwilioRestResponse response = this.getClient().safeRequest(
this.getResourceLocation(), 'POST', vars);

TwilioCall c = new TwilioCall(this.getClient(), response.toMap());
TwilioCall c = new TwilioCall((TwilioRestClient)this.getClient(), response.toMap());
c.setRequestAccountSid(this.getRequestAccountSid());
return c;
}
Expand All @@ -240,7 +240,7 @@ global class TwilioCall extends TwilioResource.InstanceResource {
TwilioRestResponse response = this.getClient().safeRequest(
this.getResourceLocation(), 'POST', vars);

TwilioCall c = new TwilioCall(this.getClient(), response.toMap());
TwilioCall c = new TwilioCall((TwilioRestClient)this.getClient(), response.toMap());
c.setRequestAccountSid(this.getRequestAccountSid());
return c;
}
Expand All @@ -257,8 +257,25 @@ global class TwilioCall extends TwilioResource.InstanceResource {
TwilioRestResponse response = this.getClient().safeRequest(
this.getResourceLocation(), 'POST', vars);

TwilioCall c = new TwilioCall(this.getClient(), response.toMap());
TwilioCall c = new TwilioCall((TwilioRestClient)this.getClient(), response.toMap());
c.setRequestAccountSid(this.getRequestAccountSid());
return c;
}

/**
* Delete this Call. This will remove it from your
* account.
*
* @throws TwilioRestException
* if there is an error in the request
* @return true, if successful
*
*/
public boolean deleteCall() {
TwilioRestResponse response = this.getClient().safeRequest(
this.getResourceLocation(), 'DELETE', null);

return !response.isError();
}

}
12 changes: 7 additions & 5 deletions src/classes/TwilioCallList.cls
Expand Up @@ -35,7 +35,7 @@ global class TwilioCallList extends TwilioResource.ListResource
*
* @param client the client
*/
public TwilioCallList(TwilioRestClient client) {
public TwilioCallList(TwilioClient client) {
super(client);
}

Expand All @@ -45,7 +45,7 @@ global class TwilioCallList extends TwilioResource.ListResource
* @param client the client
* @param filters the filters
*/
public TwilioCallList(TwilioRestClient client, Map<String, String> filters) {
public TwilioCallList(TwilioClient client, Map<String, String> filters) {
super(client, filters);
}

Expand All @@ -56,9 +56,11 @@ global class TwilioCallList extends TwilioResource.ListResource
}

/* implements method from TwilioResource.ListResource */
public override Object makeNew(TwilioRestClient client,
Map<String, Object> params) {
return new TwilioCall(client, params);
public override Object makeNew(TwilioClient client,
Map<String, Object> params) {
TwilioCall call = new TwilioCall((TwilioRestClient)client, params);
call.setRequestAccountSid(this.getRequestAccountSid());
return call;
}

/* implements method from TwilioResource.ListResource */
Expand Down
39 changes: 29 additions & 10 deletions src/classes/TwilioCapability.cls
Expand Up @@ -105,7 +105,7 @@ global class TwilioCapability {
*/
global void allowEventStream(Map<String, String> filters) {
Map<String, String> value = new Map<String, String>();
value.put('path', '/' + TwilioRestClient.DEFAULT_VERSION + '/Events');
value.put('path', '/2010-04-01/Events');
if (filters != null) {
value.put('params', generateParamString(filters));
}
Expand Down Expand Up @@ -138,7 +138,7 @@ global class TwilioCapability {
Map<String, Object> payload = new Map<String, Object>();
payload.put('iss', this.accountSid);
payload.put('exp', String.valueOf(System.currentTimeMillis()/1000 + ttl));
payload.put('scope', String.join(this.scopes, ' '));
payload.put('scope', join(this.scopes, ' '));
return jwtEncode(payload, this.authToken);
}

Expand Down Expand Up @@ -197,7 +197,7 @@ global class TwilioCapability {
/**
* Construct URL-style query param string, e.g. key1=val1&key2=val2&...keyN=valN
*/
@TestVisible private static String generateParamString(Map<String, String> params) {
private static String generateParamString(Map<String, String> params) {
String queryString = '';

Set<String> keySet = params.keySet();
Expand Down Expand Up @@ -225,26 +225,24 @@ global class TwilioCapability {
segments.add(urlSafeEncodeBase64(JSON.serialize(header)));
segments.add(urlSafeEncodeBase64(JSON.serialize(payload)));

String signature = sign(String.join(segments, '.'), key);
String signature = sign(join(segments, '.'), key);
segments.add(signature);

return String.join(segments, '.');
return join(segments, '.');
}

@TestVisible private static String urlSafeEncodeBase64(String data) {
private static String urlSafeEncodeBase64(String data) {
return urlSafeEncodeBase64(Blob.valueOf(data));
}

@TestVisible private static String urlSafeEncodeBase64(Blob data) {
private static String urlSafeEncodeBase64(Blob data) {
String encodedString = EncodingUtil.base64Encode(data);
return encodedString.replace('+','-').replace('/','_').replace('=', ''); // make URL-safe
}

/**
* Construct a String containing the contents of 'vals' separated by 'sep'
*/
// Now part of built-in String methods in Apex
/*
private static String join(List<String> vals, String sep) {
String sb = '';
for (Iterator<String> it=vals.iterator(); it.hasNext(); ) {
Expand All @@ -255,7 +253,6 @@ global class TwilioCapability {
}
return sb;
}
*/

/**
* Generate a signature for the token
Expand All @@ -269,6 +266,28 @@ global class TwilioCapability {
return result;
}

/* UNIT TESTS FOR PRIVATE METHODS */
static testMethod void testGenerateParamString() {
System.assertEquals('', generateParamString(new Map<String,String>()));
System.assertEquals('a=b', generateParamString(new Map<String,String> {'a'=>'b'} ));
System.assertEquals('cat=dog&foo=bar', generateParamString(new Map<String,String> {'cat' => 'dog', 'foo'=>'bar'} ));
System.assertEquals('a=b&c=d&e=f', generateParamString(new Map<String,String> {'a'=>'b', 'c'=>'d', 'e'=>'f' } ));
System.assertEquals('split+key1=split+val1&split+key2=split+val2', generateParamString(new Map<String,String> {'split key1'=>'split val1', 'split key2'=>'split val2'} ));
}

static testMethod void testEncodeBase64() {
System.assertEquals('',urlSafeEncodeBase64(''));
System.assertEquals('QQ',urlSafeEncodeBase64('A'));
System.assertEquals('QUI',urlSafeEncodeBase64('AB'));
System.assertEquals('QUJDRA',urlSafeEncodeBase64('ABCD'));
}

static testMethod void testJoin() {
System.assertEquals('', join(new List<String>(),','));
System.assertEquals('a', join(new List<String>{'a'},','));
System.assertEquals('a,b,c,d,e', join(new List<String>{'a','b','c','d','e'},','));
}

/* ACCESSOR METHODS FOR EXTERNAL TESTS */

public boolean test_buildOutgoingScope {
Expand Down
37 changes: 37 additions & 0 deletions src/classes/TwilioCapabilityPolicy.cls
@@ -0,0 +1,37 @@
public class TwilioCapabilityPolicy {
public static final Map<string, boolean> required = new Map<string, boolean>{'required' => true };
public static final Map<string, boolean> optional = new Map<string, boolean>{'required' => false };

private String url;
private String method;
public Map<String, Map<String, Boolean>> queryFilter {get;set;}
public Map<String, Map<String, Boolean>> postFilter {get;set;}
private Boolean allowed;

public TwilioCapabilityPolicy(String url, String method, Map<String, Map<String, Boolean>> queryFilter, Map<String, Map<String, Boolean>> postFilter, Boolean allowed) {
this.url = url;
this.method = method;
this.queryFilter = queryFilter;
this.postFilter = postFilter;
this.allowed = allowed;
}

public TwilioCapabilityPolicy(String url, String method) {
this(url, method, true);
}

public TwilioCapabilityPolicy(String url, String method, Boolean allowed) {
this(url, method, new Map<String, Map<String, Boolean>>(), new Map<String, Map<String, Boolean>>(), allowed);
}

public Map<string, Object> toMap()
{
return new Map<String, Object> {
'url' => this.url,
'method' => this.method,
'query_filter' => this.queryFilter,
'post_filter' => this.postFilter,
'allow' => this.allowed
};
}
}
5 changes: 5 additions & 0 deletions src/classes/TwilioCapabilityPolicy.cls-meta.xml
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>31.0</apiVersion>
<status>Active</status>
</ApexClass>

0 comments on commit 4e6feec

Please sign in to comment.