Wednesday, August 5, 2015

TurboBridge integration with salesforce

Requirements :

The client wanted to add a member to campaign and when this happens the contact who's addedas a campainMember should create a dial-in-pin for a conference bridge so that a contact can dial in the bridge number and join a conference 


Step 1 : The Trigger

This trigger calls the helper class method 
/* 
* Name          : TriggerOnCampainMember
* Author        : 
* Description   : Trigger to update CampaignMember.
*
* Maintenance History: 
* 03/06/2015 - Piyush Singhal - 2.0 - Created  
* 
*/
trigger TriggerOnCampainMember on CampaignMember (after update,after insert,before insert) {
 if(trigger.isAfter){
     // Version 2.0 Start
     if(trigger.isInsert){
         TriggerHelper.createBridgePinForValidCampainMenmbers(trigger.newmap);
     }
     // Version 2.0 End
     
 }
 
}

Step 2 : The Helper Class 

The Helper class method createBridgePinForValidCampainMenmbers(trigger.newmap);
    /* 
        * Description   : Method to run batch class when campain members are inserted in a campain.
        * Param 1       : mapOfCampainMembers(map of inserted campain records)
        * Created       : Created with version 2.0
        */
        public static void createBridgePinForValidCampainMenmbers(map<id,CampaignMember> mapOfCampainMembers){
            list<CampaignMember> listOfCampainMembers = new list<CampaignMember>();
            listOfCampainMembers = [SELECT Id,Contact.Dial_in_Unique_PIN__c,Campaign.RecordTypeID FROM CampaignMember WHERE id IN:mapOfCampainMembers.keyset()];
            RecordType RecordTypeId = [SELECT id,name,SobjectType from RecordType WHERE SobjectType ='Campaign' AND name = ' Events' Limit 1];
            list<string> listOfContactId = new list<string>();
            for(CampaignMember eachCM:listOfCampainMembers){
                system.debug('eachCM11111111'+eachCM);
                if((eachCM.Contact.Dial_in_Unique_PIN__c ==null||eachCM.Contact.Dial_in_Unique_PIN__c =='') && eachCM.Campaign.RecordTypeID == RecordTypeId.id){
                    listOfContactId.add(eachCM.ContactId);
                } 
            }
            if(listOfContactId.size()>0){
                Database.executeBatch(new BatchClassToGetTurboBridgePin(listOfContactId),1);
            }
        }

Step 3 : The Batch Class 

The batch Class method BatchClassToGetTurboBridgePin(listOfContactId)
We are passing list of contactId to the constructor of the batch class
    /* 
* Name          : BatchClassToGetTurboBridgePin
* Author        : 
* Description   : Batch class to get TurboBridge pin for each contact.
* Test Class    : BatchClassGetTurboBridgePin_Test
* Maintenance History: 
* 10/06/2015 - Piyush Singhal - 1.0 - Created 
*/
global with sharing class BatchClassToGetTurboBridgePin implements Database.Batchable<sObject>,Database.AllowsCallouts,Database.stateful{
    global list<id> listOfContactId = new list<id>();
    global list<Contact> listOfContactToUpdate = new list <Contact>();
    global BatchClassToGetTurboBridgePin(List<id> listOfContact){
        listOfContactId = listOfContact       ;  
    }

    global Database.QueryLocator start(Database.BatchableContext BC){
        return DataBase.getQueryLocator([SELECT Id,FirstName,LastName,Title,name,Dial_in_Unique_PIN__c,RecordTypeId,Account.name,TB_ToUpdateNameInTB__c FROM Contact WHERE Id IN: listOfContactId]);
    }
    
    global void execute(Database.BatchableContext BC,List<sObject> scope){
        system.debug('Batch Class Execute');
        system.debug('Batch Class Execute'+scope);
        
        for(sObject Eachscope:scope){
            listOfContactToUpdate.add(TriggerHelper.insertUpdatePinInTurboBridge1((Contact)Eachscope));
            
        }
        
    }
    
    global void finish(Database.BatchableContext BC){
            try{
                update listOfContactToUpdate;
            }catch(Exception ex){
                System.debug('*****Excetion in batch class******'+ex);
            }
            system.debug('Batch Class Finish');
        }
}

Step 3 : The Callout method 1 - Getting last Inserted PIN

    /* 
    * Description   : Does a callout on turbobridge to get the last inserted pin.
    * Exception     : Handeling by try & catch
    * Created       : Created with version 2.0
    * Modification : Version 3.0 - updated the method to get the maximum number of inserted pin then
    *      do a callout again with a parameter offst to get the last inserted pin
    * Callouts      : 2
    * API Doc       : https://api.turbobridge.com/3.0/
    * Return        : Returns the last pin inserted on turbobridge as a string
    */
    public static string getLastInsertedPin(){
        
        AlgoWorks_TurboBridgeIntegration__c TB_variable = AlgoWorks_TurboBridgeIntegration__c.getValues('Value');
        System.debug('TB_variable'+TB_variable);
        String body = 'outputFormat=json';
        Integer offSetValue = 0 ;
        list<integer> listOfUserIdFromTB = new list<integer>();
        if(TB_variable != null){
         body = body +'&authAccountEmail='+TB_variable.TB_username__c;
         body = body +'&authAccountPassword='+TB_variable.TB_password__c;
         body = body +'&authAccountPartnerID=turbobridge';
         body = body +'&authAccountAccountID='+TB_variable.TB_accountId__c;
         body = body +'&requestType=getBridgeUserIDs';
         body = body +'&conferenceID='+TB_variable.TB_conferenceIdA__c;
        }
        
        HttpRequest req = new HttpRequest();
        req.setEndpoint('https://api.turbobridge.com/Bridge');
        req.setMethod('GET');    
        req.setBody(body);
        
        Http h = new Http();
        HttpResponse res;
        if(test.isRunningTest()){
         req.setEndpoint('https://www.google.com');
         res =new Httpresponse();
        }
        try{
            res = h.send(req);
        }catch(Exception ex){
            System.debug('*************Exception in callout*************'+ex);
        }
        if(!test.isRunningTest()){
         //System.debug('values'+res.getBody());
        }
        
        try{
            AlgoWorks_TurboBrigeResponse response = (AlgoWorks_TurboBrigeResponse)JSON.deserialize(string.valueOf(res.getBody()), AlgoWorks_TurboBrigeResponse.class);
            for (AlgoWorks_TurboBrigeResponse.requestItem ri : response.responseList.requestItem) {
               System.debug('Piyush Result'+ri.result.totalResults);
               offSetValue = ri.result.totalResults;
            }
        }catch(Exception ex){
            System.debug('**********Exception in deserializing the pin******** '+ex);
        }
        //Start Verion 3.0 Callout with offset
        body = body+'&startOffset='+string.valueOf(offSetValue-1)+'&';
        body = body+'resultCount=1000';
        system.debug('Piyush Body'+body);
        HttpRequest req2 = new HttpRequest();
        req2.setEndpoint('https://api.turbobridge.com/Bridge');
        req2.setMethod('GET');    
        req2.setBody(body);
        
        Http y = new Http();
        HttpResponse res2;
        if(test.isRunningTest()){
         req2.setEndpoint('https://www.google.com');
         res2 =new Httpresponse();
        }
        try{
            res2 = y.send(req2); 
        }catch(Exception ex){
            System.debug('*************Exception in callout*************'+ex);
        }
        if(!test.isRunningTest()){
         //System.debug('values'+res2.getBody());
        }
        try{
            AlgoWorks_TurboBrigeResponse response = (AlgoWorks_TurboBrigeResponse)JSON.deserialize(string.valueOf(res2.getBody()), AlgoWorks_TurboBrigeResponse.class);
            for (AlgoWorks_TurboBrigeResponse.requestItem ri : response.responseList.requestItem) {
               for (AlgoWorks_TurboBrigeResponse.bridgeUserID u : ri.result.bridgeUserID) {
                    listOfUserIdFromTB.add(integer.valueOf(u.userID));
                }
            }
        }catch(Exception ex){
            System.debug('**********Exception in deserializing the pin******** '+ex);
        }
        //End Version 3.0 Callout with offset
        
        
        listOfUserIdFromTB.sort();
        system.debug('listOfUserIdFromTB'+listOfUserIdFromTB);
        if(listOfUserIdFromTB.size()>0){
         return string.valueOf((listOfUserIdFromTB.get(listOfUserIdFromTB.size()-1))+1);
        }
        else{
         return null;
        }
         
    }

Step 3 : The Callout method 2 - Creating a pin for a bridge  

    /* 
    * Description   : Method to update ranking on campain members from Contacts.
    * Param 1       : contactToUpdate(list of contacts to add to turbobridge and update Pin)
    * Exception     : Handeling by try & catch
    * Created       : Created with version 1.0
    * Callouts      : 1
    * API Doc       : https://api.turbobridge.com/3.0/
    * Return        : returns the updated contact with the pin
    */
    public static Contact insertUpdatePinInTurboBridge1(Contact contactToUpdate){
            Contact con = contactToUpdate;
            system.debug('***TriggerClass**up*'+con.Dial_in_Unique_PIN__c+'>>>>>>>>>>>>>>>'+contactToUpdate);
            Database.SaveResult results ;
            RecordType contactRecordType = [SELECT id,name,SobjectType from RecordType WHERE SobjectType ='Contact' AND name = 'Industry Participant' Limit 1];
            AlgoWorks_TurboBridgeIntegration__c TB_variable = AlgoWorks_TurboBridgeIntegration__c.getValues('Value');
            if(!con.TB_ToUpdateNameInTB__c || con.Dial_in_Unique_PIN__c==null || con.Dial_in_Unique_PIN__c == ''){
                con.Dial_in_Unique_PIN__c = getLastInsertedPin();
            }
            else{
                con.TB_ToUpdateNameInTB__c = false;
            }
            JSONGenerator gen = JSON.createGenerator(true);
            
            gen.writeStartObject();
                
            gen.writeFieldName('request');
            
            gen.writeStartObject();
                
            gen.writeFieldName('authAccount');
            
            gen.writeStartObject();
           
            System.debug('>>>>>>>>>>>>>>>TB_variable'+TB_variable);
             System.debug('>>>>>>>>>>>>>>>TB_variable.TB_username__c'+TB_variable.TB_username__c);
             gen.writeStringField('email', TB_variable.TB_username__c);
             gen.writeStringField('password', TB_variable.TB_password__c);
             gen.writeStringField('partnerID', 'turbobridge');
             gen.writeStringField('accountID', TB_variable.TB_accountId__c);
             gen.writeEndObject();
             
             gen.writeFieldName('requestList');
             gen.writeStartArray();
             
             gen.writeStartObject();
             gen.writeFieldName('setBridgeUserID');
             gen.writeStartObject();
             gen.writeStringField('conferenceID',TB_variable.TB_conferenceIdA__c);
             System.debug('>>>>>>>>>>>>>>>>>>>>>>>>>>contactToUpdate'+contactToUpdate);
             if(test.isRunningTest()){
              contactToUpdate.Dial_in_Unique_PIN__c='1';
             }
             gen.writeStringField('userID', contactToUpdate.Dial_in_Unique_PIN__c);
             gen.writeStringField('name', getValidNameForTurboBridgePin(contactToUpdate));
             gen.writeStringField('hostFlag',(contactToUpdate.RecordTypeId==contactRecordType.id?'1':'0'));
             gen.writeEndObject();
             gen.writeEndObject();
              
             gen.writeStartObject();
             gen.writeFieldName('setBridgeUserID');
             gen.writeStartObject();
             gen.writeStringField('conferenceID',TB_variable.TB__c);
             gen.writeStringField('userID', contactToUpdate.Dial_in_Unique_PIN__c);
             gen.writeStringField('name', getValidNameForTurboBridgePin(contactToUpdate));
             gen.writeStringField('hostFlag',(contactToUpdate.RecordTypeId==contactRecordType.id?'1':'0'));
             gen.writeEndObject();
             gen.writeEndObject();
             
             //setBridge
             gen.writeEndArray();
             
             gen.writeEndObject();
             gen.writeEndObject();  
            String generate = gen.getAsString(); 
            HttpRequest req = new HttpRequest();
            req.setEndpoint('https://api.turbobridge.com/Bridge');
            req.setHeader('Content-Type', 'application/json');
            req.setMethod('POST');    
            req.setBody(generate);
            Http h = new Http();
            HttpResponse res ;
            try{
                res = h.send(req);
            }catch(exception ex){
                System.debug('********Exception in callout************'+ex);
            }
            if(!test.isRunningTest()){
             System.debug(res.getBody());
            }
            system.debug('***TriggerClass***'+contactToUpdate.Dial_in_Unique_PIN__c);
            con.TB_ToUpdateNameInTB__c = false;
            return con;
        }
        
        /* 
        * Description   : Method to generate a name to be inserted in turbobridge.
        * Param 1       : contactVariable contact to be inserted in turbobridge.
        * Created       : Created with version 2.0
        * Return        : Returns the name to be inserted as string.
        */
        public static string getValidNameForTurboBridgePin(Contact contactVariable){
           return contactVariable.FirstName+' '+contactVariable.LastName+' '+' ('+contactVariable.Account.name+' - '+contactVariable.Title+')';
        }

No comments:

Post a Comment