Skip to content

Instantly share code, notes, and snippets.

@fractastical
Created May 24, 2011 21:37
Show Gist options
  • Save fractastical/989764 to your computer and use it in GitHub Desktop.
Save fractastical/989764 to your computer and use it in GitHub Desktop.
@dLog Restful JSON Controller
public with sharing class RESTController {
public void processRequest(){
validateRequest();
if( HasError )
return;
//Add support for other types of verbs here
processGetQuery();
}
static final string ERROR_MISSING_SOQL_PARAM = 'Bad Request. Missing soql parameter';
static final string ERROR_SOBJECT_MISSING = 'Bad Request. Could not parse SObject name from SOQL';
static final string ERROR_FROM_MISSING = 'Bad request. SOQL missing FROM keyword';
public void validateRequest(){
if(Query == null){
errorResponse(400, ERROR_MISSING_SOQL_PARAM);
}
else if(sObjectName == null){
//Force a get of object name property.
//Detailed error response should already be logged by sObjectName parser
}
}
public boolean HasError = False;
private void errorResponse(integer errorCode, string errorMessage){
JSONResponse.putOpt('status', new JSONObject.value(errorCode));
JSONResponse.putOpt('error', new JSONObject.value(errorMessage));
HasError = True;
}
public void processGetQuery(){
Map<String, Schema.SObjectField> fieldMap = Schema.getGlobalDescribe().get(SObjectName).getDescribe().fields.getMap();
List<JSONObject.value> objectValues = new List<JSONObject.value>();
List<sObject> resultList = Database.query(Query);
for(sObject obj : resultList){
JSONObject json = new JSONObject();
json.putOpt('id', new JSONObject.value( obj.Id ));
for(SObjectField field : fieldMap.values() ){
try{
string f = field.getDescribe().getName();
string v = String.valueOf( obj.get(field) );
json.putOpt(f, new JSONObject.value( v ));
}
catch(Exception ex){
//Ignore. Field not included in query
}
}
objectValues.add(new JSONObject.value(json));
}
JSONResponse.putOpt('status', new JSONObject.value(200));
JSONResponse.putOpt('records', new JSONObject.value(objectValues));
}
private string m_query = null;
public string Query{
get{
if(m_query == null && ApexPages.currentPage().getParameters().get('soql') != null){
m_query = ApexPages.currentPage().getParameters().get('soql');
}
return m_query;
}
}
static final string SOQL_FROM_TOKEN = 'from ';
private string m_sObject = null;
public string sObjectName{
get{
if(m_sObject == null && Query != null){
string soql = Query.toLowerCase();
integer sObjectStartToken = soql.indexOf(SOQL_FROM_TOKEN);
if(sObjectStartToken == -1){
errorResponse(400, ERROR_FROM_MISSING);
return null;
}
sObjectStartToken += SOQL_FROM_TOKEN.length();
integer sObjectEndToken = soql.indexOf(' ', sObjectStartToken);
if(sObjectEndToken == -1)
sObjectEndToken = soql.length();
m_sObject = Query.substring(sObjectStartToken, sObjectEndToken);
m_sObject = m_sObject.trim();
system.debug('m_sObject = ' + m_sObject);
}
return m_sObject;
}
}
private JsonObject m_jsonResponse = null;
public JSONObject JSONResponse{
get{
if(m_jsonResponse == null)
m_jsonResponse = new JSONObject();
return m_jsonResponse;
}
set{ m_jsonResponse = value;}
}
public String getJSONResult() {
return JSONResponse.valueToString();
}
public static testMethod void unitTests(){
RESTController controller = new RESTController();
controller.processRequest();
system.assertEquals(True, controller.HasError);
system.assertEquals(True, controller.JSONResponse.has('status'));
system.assertEquals(400, controller.JSONResponse.getValue('status').num);
system.assertEquals(True, controller.JSONResponse.has('error'));
system.assertEquals(ERROR_MISSING_SOQL_PARAM, controller.JSONResponse.getValue('error').str);
controller = new RESTController();
ApexPages.currentPage().getParameters().put('soql', 'select Id fro Lead');
controller.processRequest();
system.assertEquals(True, controller.HasError);
system.assertEquals(True, controller.JSONResponse.has('status'));
system.assertEquals(400, controller.JSONResponse.getValue('status').num);
system.assertEquals(ERROR_FROM_MISSING, controller.JSONResponse.getValue('error').str);
controller = new RESTController();
ApexPages.currentPage().getParameters().put('soql', 'select Id from Lead');
controller.processRequest();
system.assertEquals(False, controller.HasError);
system.assertEquals('Lead', controller.sObjectName);
Lead testLead = new Lead(FirstName = 'test', LastName = 'lead', Company='Bedrock', Email='fred@flintstone.com');
insert testLead;
controller = new RESTController();
ApexPages.currentPage().getParameters().put('soql', 'select Id from Lead where email=\'fred@flintstone.com\'');
controller.processRequest();
system.assertEquals(False, controller.HasError);
system.assertEquals('Lead', controller.sObjectName);
system.assertEquals(True, controller.JSONResponse.has('records'));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment