Sunday 10 January 2021

Input Data

REST API With Javascript

Monday 17 July 2017

Salesforce Rest API Username and Password authentication with community user

1. Copy and paste below code in your org


@RestResource(urlMapping='/CommuntyLogin/*')
global class CommuntyLogin {

/**
* To use this rest service first the user must issue a call to the /login GET method. if the credentials are valid 
* for this org, that call will return a session ID
**/

@HttpGet
global static void doGet(){
//setup return data
RestContext.response.addHeader('Content-Type', 'application/json');
RestResponseWrapper thisResponse = new RestResponseWrapper(RestContext.request);
try{       
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;

//String responseBody = RestContext.request.requestBody.toString();                
//ValidateCredentials validate = (ValidateCredentials) System.JSON.deserialize(responseBody, ValidateCredentials.class);  

String username = RestContext.request.params.get('username');
String password = RestContext.request.params.get('password');
String orgId = RestContext.request.params.get('orgId');
String loginDomain = RestContext.request.params.get('domain');

loginResult thisResult = validLogin(username,password,orgId,loginDomain);

if(!thisResult.success) {
throw new applicationException('Invalid Login');
}
else {
thisResponse.responseData = thisResult;
}                               
}
catch(exception e){
thisResponse.success = false;
thisResponse.message= e.getMessage();
}
//return the data to the client.
RestContext.response.responseBody = formatResponse(thisResponse);  
}


/** 
* Checks the validity of a provided username and password for a given org ID at the given domain.
* @param username the username of the person the check. Looks like name@domain.tld
* @param password the password of the user name to check
* @param orgId the ID of the organization to validate the credentials against.
* @param loginDomain the login domain the use, such as 'login' (for a prod/dev instance) or 'test' (for a sandbox instance)
* @return loginResult a simple object with a boolean success flag and a sessionId if the login is successful.
**/
public static loginResult validLogin(string username, string password, Id orgID, string loginDomain){
loginResult thisResult = new loginResult();
thisResult.success = false;      

//-------------------------------------------------------

string xmlData = '<?xml version="1.0" encoding="utf-8"?>';     
xmlData += '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com">';  
xmlData += '<soapenv:Header>';  
xmlData += '<urn:LoginScopeHeader>';  
xmlData += '<urn:organizationId>'+orgID+'</urn:organizationId>';  
xmlData += '</urn:LoginScopeHeader>';  
xmlData += '</soapenv:Header>';  
xmlData += '<soapenv:Body>'; 
xmlData += '<urn:login>';
xmlData += '<urn:username>'+username+'</urn:username>';
xmlData += '<urn:password>'+password+'</urn:password>';
xmlData += '</urn:login>'; 
xmlData += '</soapenv:Body>';  
xmlData += '</soapenv:Envelope>';

//------------------------------------------------------


//create the HTTP request to send to the SOAP API
HttpRequest request = new HttpRequest();
request.setEndpoint('https://'+loginDomain+'.salesforce.com/services/Soap/c/39.0');
request.setMethod('POST');
request.setHeader('Content-Type', 'text/xml;charset=UTF-8');
request.setHeader('SOAPAction', '""');
request.setBody(xmlData);       
HttpResponse response = new Http().send(request);

final Boolean verified = response.getBodyDocument().getRootElement()
 .getChildElement('Body','http://schemas.xmlsoap.org/soap/envelope/')
 .getChildElement('loginResponse','urn:enterprise.soap.sforce.com') != null;


//if the login is valid, now check to see if the orgId this account is for matches the given orgId
if(verified){
final string userOrgId = readXmlElement(string.valueOf(response.getBody()), 'organizationId');
if(userOrgId == orgId){
thisResult.sessionId = readXmlElement(string.valueOf(response.getBody()), 'sessionId');
thisResult.success = true;
}
}
return thisResult;
}

/**
* Reads a single XML attribute element from an XML document
* useful for just getting a single element from some XML without having to go through the complexity of 
* full on parsing.
* @param xmlBody the XML document body to find elementName in
* @elementName the XML element to read the value from and return. 
* @return the value of the element if it exists, or null if it does not.
**/
public static string readXmlElement(string xmlBody, string elementName){        
Xmlstreamreader reader = new Xmlstreamreader(xmlBody);

while(reader.hasNext()) {
if (reader.getEventType() == XmlTag.START_ELEMENT &&  reader.getLocalName() == elementName){
reader.next();
return getDecodedString(reader);
}
reader.next();
}     
return null;
}

/**
* Decodes a URL encoded string into a non encoded string
**/
public static String getDecodedString(Xmlstreamreader reader){
return EncodingUtil.urlDecode(reader.getText(), 'UTF-8').trim();
}

/**    
* take one of those wrapper objects and format it by wrapping it in a callback if needed, and serializing 
* the result into json. Callbacks allow for cross domain javascript requests. Uses callback param in the url
* @param responseData an object of whatever data you want to return to the client. Can be anything that can be serialized as JSON
* @return a blob to be sent to the client. JSON encoded, wrapped in callback if one is provided in the URL.
**/   
public static blob formatResponse(object responseData){
string response = JSON.serialize(responseData);
return blob.valueOf(response);


/**
* Result of login call. More data could be populated here, but this is all we need for now
**/
public class loginResult{
public boolean success{get;set;}
public string sessionId{get;set;}
}    

/** Custom Exception Class **/
public class applicationException extends Exception {}

/**
* simple wrapper response class. Makes it so all replies via this API have the same basic structure
* including a boolean success flag, a message, any sObjects affected and some debugging params.
**/
public class restResponseWrapper{
public string message;
public boolean success;    
public object responseData;
public object inputData;
private string requestURI;

public restResponseWrapper(RestRequest reqContext){           
message = 'run successful';
success = true;
requestURI = reqContext.requestURI;
}
}

public class ValidateCredentials{
public String username; 
public String password; 
public String orgId;    
public String domain;   
}

}


2. Create community and activate 

3. After community creation go to site> communityname > public access setting > Enabled Apex Class Access> Add above class"CommuntyLogin" and save

4. Modifiy below URL with your org deatils ,open new tab in browser and copy paste below URL 


Org with Without Name Space


https://imranshaik-******Community Domain Name********com/***Path**/services/apexrest/CommuntyLogin?username=skimran1038@gmail.com&password=1q********5t&orgId=00D******0I8RZ&domain=login


User Name : community user or normal user name

Password : Password

Org ID : Organization ID

domain : Production "login" , Sandbox "test
"

Ex: 

https://imranshaik-developer-edition.ap2.force.com/PopularTech/services/apexrest/CommuntyLogin?username=skimran1038@gmail.com&password=1********5t&orgId=00D2****I8RZ&domain=login


Org with Name Space 


https://imranshaik-******Community Domain Name********com/***Path**/services/apexrest/*****NameSpcae***/CommuntyLogin?username=skimran1038@gmail.com&password=1q***********5t&orgId=00D280*****Z&domain=login
             

NameSpcae : organization name space Ex: "ExpenceTracker"

User Name : community user or normal user name

Password : user Password

Org ID : Organization ID

domain : For Production "login" , Sandbox "test"


Ex: 

https://imranshaik-developer-edition.ap2.force.com/PopularTech/services/apexrest/ExpenceTracker/CommuntyLogin?username=skimran1038@gmail.com&password=1q2**********5t&orgId=00D280*********I8RZ&domain=login


Wednesday 5 October 2016

Salesforce Chatter Profile Pic Upload

Uploads a user’s photo to their Chatter profile page


To upload chatter profile pic from visual force page no need to write single piece of apex code or lot of visual force components

By using only one visual force component we can achieve this

By using below component we can Uploads a user’s photo to their Chatter profile page.

Visual Force page:

<apex:page >
    <chatter:userPhotoUpload showOriginalPhoto="true"/>
</apex:page>




Note :  

1. To use this component, you must enable Chatter in the org.

2. Users must belong to either Standard User, Portal User, High Volume Portal User, or          Chatter External User profiles. 
3. In apex page component "showHeader" attribute should "true"

Monday 21 December 2015

DUPLICATE RECORD FINDING

Without trigger , workflow , validation.......

By using Duplicate Management we can restrict end user not to allow duplicate records 

When a user attempts to save a new record, the record is first compared with existing Salesforce records to identify possible duplicates (1). 

The criteria used to compare records and identify the possible duplicates are defined by a matching rule. 

Next, a list of possible duplicates is returned (2).

 What happens when the record being saved is identified as a possible duplicate depends on what’s defined in the duplicate rule (3). 

For example, the duplicate rule could block users from saving the possible duplicate record or allow them to save it anyway. 

Both the Block and Allow options include an alert, which tells users why they can’t save the record and what they need to do. 

The Allow option includes the ability to report on the duplicate records.

When a user attempts to save an edited record, the record is first checked to see if the user has changed the value of a matching rule field.

 If so, the duplicate management process works as described for new records.

 If not, no further action is taken and duplicates are not detected.



Follow below steps to create matching and duplicate rule in salesforce 


STEP 1 :

Go to setup>Administration Setup>Data.com Administration>Duplicate Management>Matching Rules


STEP 2 :

New Rule>SelectObject>

1. Rule Name : TestMatchingRule
2. Matching Rule Criteria : Select fileds which you want to match duplicate records

EX: Name : Exact






STEP 3 :

Go to setup>Administration Setup>Data.com Administration>Duplicate Management>Duplicate Rules

New Rule>Select Object>





In duplicate management give any name in name section


In Action section select action when duplicate rule has to fire


In Matching rule section select the matching rule before created


Condition section is optional


Click on save


Note : After saving duplicate or matching rule Activate the Matching as well as Duplicate rule



STEP 4 : 

Go to object and try to create same record two times





Note : No need of Data.com Licence , it is free for all licence


                                                  That's all folk

Wednesday 15 April 2015

EMAIL TO APEX USING EMAIL SERVICES IN SALESFORCE



By using Email Services in sales force we can invoke an apex class 
 
By sending an email from any email service(gamil,yahoo..etc) to sales force generated email address it will invoke the apex class 

First we have to create an email service in sales force it will generated an email address 
 
Follow the below steps to create an email service and apex class in sales force

Step 1 : Create an apex class to executive when email receive 


 Ex: Below is the sample code to insert a record in contact (Data got from email body and subject)

global class CreateContactFrmEmail implements Messaging.InboundEmailHandler {
 global Messaging.InboundEmailResult handleInboundEmail(Messaging.InboundEmail      email,Messaging.InboundEnvelope envelope) {
Messaging.InboundEmailResult resultData = new Messaging.InboundEmailresult();

if((email.subject ! = null && email.plainTextBody != null){

      Contact con = new Contact();
         con.LastName = email.fromName;
         con.Email = email.fromAddress;
         con.Description = email.plainTextBody;
         con.Title = email.subject;
      insert con;

if(email.textAttachments != null){
      for (Messaging.Inboundemail.TextAttachment tAttachment : email.textAttachments) {
             Attachment attachment = new Attachment();
                 attachment.Name = tAttachment.fileName;
                 attachment.Body = Blob.valueOf(tAttachment.body);
                 attachment.ParentId = con.Id;
            insert attachment;
      }
}

  if(email.binaryAttachments != null){
        for (Messaging.Inboundemail.BinaryAttachment bAttachment : email.binaryAttachments) {
              Attachment attachment = new Attachment();
                 attachment.Name = bAttachment.fileName;
                 attachment.Body = bAttachment.body;
                 attachment.ParentId = con.Id;
             insert attachment;
      }
  }
}
      resultData.success = true;
      return resultData;
   }
}

Step 2 : After creation of sales force apex class follow below steps to create email service 


Go to SETUP > BUILD > DEVELOPE > EMAIL SERVICES > NEW EMAIL SERVICES



Fill the form

1. Email Service Name : give any name

2. Apex Class : Select a class which you want to executive when email send

3. Accept Attachments : If you want add attachments then select which type of attachment your adding

4. Accept Email From : List the email addresses and domains from which you want this email service                                       to receive emails.                       
Separate multiple entries by commas. For example: george@mycompany.com, yahoo.com, gmail.com.

Leave this field blank if you want the email service to receive email from any email address or domain.
 
5. Active : Check if you want to use this service

6. Route Error Emails to This Email Address : If error occurs while sending, if you want know error ,     give your email address to receive error

7. Save

Step 3 : After saving the record create new email address under Email Addresses


1. Email address : Don't change any thing

2. Accept Email From : Enter email addresses or domain names that are authorized to send emails to      the service.

Separate multiple entries by commas. Examples: george@mycompany.com, yahoo.com, gmail.com.

NOTE: the addresses entered in this field must be the same as or fully qualify addresses or domains allowed by the service as shown above. For example, if the service's list above only include mycompany.com then the list entered below must be of the form user1@mycompany.com, user2@mycompany.com, etc.

3. Save

After saving it will generate an new email address

Step 4 : Copy the email address generated in step 3 and send an email from your email(gmail,yahoo,....etc)  


Then go to the contact object and check it record is create or not

NOTE : wait for few minutes it will take some time to insert a record in sales force



Thursday 26 March 2015

SALESFORCE TO SALESFORCE INTEGRATION USING REST/SOAP API

For sales force to sales force integration required  Two organization

1. Sales Force Org 1 
2. Sales Force Org 2

STEP 1 : Create one ViSsula Force Page and Controller in Sales Force Org 2


Visual Force Page: (Page Name : sfdc_to_sfdc)

<apex:page controller="ExternalServiceCall">
<apex:form >
<apex:commandButton value="CallService" action="{!callMethod}" title="CallService"/>
</apex:form>
</apex:page>

Apex Controller:

public class ExternalServiceCall {
public PageReference callMethod() {
String Endpoint = '';
Http http = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint(Endpoint);
req.setMethod('POST');
HTTPResponse res = http.send(req);
System.debug('----------------'+res.getBody());
return null;
}
}

STEP 2 : Create one CONNECTED APP in Sales Force Org 1

1. Go to SETUP > BUILD > CREATE > APP > CONNECTED APP > NEW

Connected App Name : S_TO_S_APP

Contact Email : Your Email Address

API (Enable OAuth Settings) : Check (Enable OAuth Settings)

Callback URL : Sales Force Org 2 visual force page URL (sfdc_to_sfdc)

EX: https://c.ap2.visual.force.com/apex/CallExternalService

Selected OAuth Scopes : Select all and move from left to right


2. SAVE

STEP 3 : Copy consumer key and Consumer Secret and paste in note pad


1. Consumer Key (3MVG9Y6d_Btp4xp46JlONG7HS6J2U7.oBhNF2mAUQhyotYkFWexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)

2. For consumer secret click on reveal copy the code (86658178********)

STEP 4 :

https://**salesforce instance**/services/oauth2/authorize?response_type=code&client_id=**Cosumer key**&redirect_uri=**Callback URL**&state=mystate1

In Above URL replace below given parameters

1. **salesforce instance** : Replace with your sales force org instance

2. **Cosumer key** : Consumer Key of connected APP which we copied in the above step

3. **Callback URL** : Sales Force Org 2 visual force page URL

4. State : give your own string in state

Note : state should be different every time your calling this URL


STEP 5 : Copy the Above URL and open in a new browser

1. It will open an window which asking to permission (Allow IT)

2. It will ask your Sales Force Org 2 credentials (Give your credential and login)

3. Page Redirect to visual force page (sfdc_to_sfdc)

4. Visual force URL should look like 
https://c.ap2.visual.force.com/apex/CallExternalService&code=aPrxqJ8A8kLOza.1WWrtEdk2HbfhS3ZFa7OAR20zsgGyVdnZVO_ieN6nRxWBwka19lulk3RoTg%3D%3D&state=mystate1 

5. From the URL copy the CODE and paste in note pad

STEP 6 :

https://**salesforce instance**/services/oauth2/token?code=**code**&grant_type=authorization_code&client_id=**Consumer Key**&client_secret=**Consumer Secret**&redirect_uri=**Call Back URL**

Above URL is to get the Access Token

1. **salesforce instance** : Replace with your sales force org instance

2. **code** : STEP 5

3. **Consumer Key** : STEP 3

4. **Consumer Secret** : STEP 3

5. **Call Back URL** : Sales Force Org 2 visual force page URL

NOTE: Go to Remote site settings and create new remote site (Name : salesforceOrg, URL : **salesforce instance**)

STEP 7: Copy the above URL and paste in STEP 1 class > method > String  Endpoint


1. Class : ExternalServiceCall

Method : callMethod

String Endpoint = STEP 6 (URL)

2. Save

3. Click on Save button

4. Go to the debug log

5. Copy the Access Token

Now Integration is Done with sales force now you can make calls from sales force to sales force

   STEP 8: To call class of Sales Force Org 1 from Sales Force Org 2

EX:

Create a class in Sales Force Org 1

Apex Controller :

@RestResource(urlMapping='/sfdcCalling/*')
global class SalesforceOrg{
@HttpGet
global static List<Contact> sfdcMethod(){
List<Contact> sfdcContact = new List<Contact>();
sfdcContact = [select Name,Email from Contact];
return sfdcContact;
}
}

Call Above calss (SalesforceOrg) From Org 2

Copy the below code and paste in developer console or workbench in Sales Force Org 2 and executive

String accessToken = '00D90000000iCmb!AR4AQKhpsb2wJYLLxdafV71KdkRxBmRuRmWD_LTmEtRkFdxTWYh_V7CPqc*******************************';
Http http = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint('https://immu-dev-dev-ed.my.salesforce.com/services/apexrest/sfdcCalling');
req.setMethod('GET');
req.setHeader('Authorization',' Bearer '+accessToken);
HTTPResponse res = http.send(req);
System.debug('----------------'+res.getBody());

Note : 
Access Token : From STEP 7

setEndpoint : should be Sales Force Org 1 Endpoint ,In above http call the end point is Sales Force Org 1 class Annotation Name(sfdcCalling)

STEP 9: For more endpoints please refer the below URL

https://developer.salesforce.com/page/Creating_REST_APIs_using_Apex_REST


Tuesday 3 March 2015

TRIGGER RECURSION IN SALESFORCE

How to avoid Trigger Recursion in salesforce


If an executing trigger calls itself then it goes to into infinite loop and is called recursion.
Use Case
trigger DemoTrigger on Demo__c (before insert) {
insert new Demo__c();
}
In the above example when try to insert a record in trigger again Trigger will invoke(Because when try to insert a record again trigger will invoke) until trigger limit exceeded

If a trigger on a particular object executing on a particular DML does the same DML on that object then the same trigger would be called and it will go into recursion.
A static variable can be set in a class before executing the trigger to avoid the recursion.
Solution 

Class:
public class p { 
  public static boolean firstRun = true; 
}
Trigger:
trigger TestTrigger on Demo__c (before insert) {
if(p.firstRun)
{
p.firstRun = false;
insert new Demo__c();
}    
}