Scripting - Record INSERT, UPDATE, UPSERT
iDialogue scripts may create or update Salesforce records from customer experience (CX) rooms.
Examples of common interactions including
- Recording a quote selection
- Updating context information
Record I/O Best Practices
It is generally best practice for a script to update a checkbox or DateTime field on a Salesforce record to record an interaction. Then let a record-trigger flow execute more detailed DML or record modification.
Scripts should implement AJAX and asynchronous handlers when POSTing to the /records API.
Scripts should handle exceptions gracefully, protecting the end user from experiencing full stack traces.
Records are created and updated on-behalf of the iDialogue OAUth user established under the iDialogue Admin “Quick Start” tab.
API
The script records API provides:
- API Endpoint
- One POST body request
- A JSON representation for records
- An API response body
Endpoint
https://api.i-dialogue.com/v1/orgs/{orgid}/rooms/{room_id}/records
The API endpoint can be constructed by concatenating the roomContext.url
prperty and /records
.
var apiUrl = context.url + 'records';
Method
The API supports only POST
requests. The request method
property determines the context of record INSERT, UPDATE, or UPSERT.
Request
The POST body contains the following properties.
var request = {};request.orgId; // (Optional) Provided in REST URL pathrequest.roomId; // (Optional) Provided in REST URL pathrequest.origin; // (Reserved)request.storedProcedure; // Reference to a MDT develper_name with predefined DML rules.request.method; // (Required) Valid values: INSERT, UPDATE, UPSERTrequest.type // (Required) The SObject type. Opportunity, Contact, etc...request.externalField; // Required if method is UPSERTrequest.records; // (Required) An array collection of Salesforce records for DML.
Response
var response = JSON.parse( xmlhttp.response );response.success // (Boolean) true if operation was successful.response.message // Contains high level error message if success === falseresponse.errors // Array collection of detailed error messages.response.orgId // Reflects the provided request value.response.roomId // Reflects the provided request value.response.origin // Reflects the provided request value.response.storedProcedure //Reflects the provided request value.response.method // Reflects the provided request value.response.type // Reflects the provided request value.response.records // Array collection of records. // For INSERT method, the records contain their new ID. // The individual SRecords will also contain success and message // properties in the response.
SRecord
The records
property in the API Request and Response defines the following properties:
var sRecord = {};sRecord.id; // Required for UPDATE and UPSERT operations. // 18-char ID reference to a Salesforce record.sRecord.type; // The Salesforce record type. Example "Opportunity", "Contact"sRecord.name; // Required for INSERT. The record Name (if name is a required field).sRecord.fields; // Map collection of key/values. // Key: API name of a field // Value: String field value.
API Examples
Query Quotes and Update Opportunity
The following example queries all quotes associated with an Opportunity, then updates a custom field on Opportunity to designate the customer selected Quote.
<script> function queryQuotes(){ var queryURL = roomContext.url + '/query'; var queryRequest = {}; queryRequest.query = "SELECT Id, Name, TotalAmount FROM Quote WHERE OpportunityId='" + roomContext.masterRecordId + "' LIMIT 100";
var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", queryURL ); xmlhttp.setRequestHeader("Content-Type", "application/json" ); xmlhttp.setRequestHeader("Authorization", roomContext.sessionId ); xmlhttp.send(JSON.stringify( queryRequest ) ); xmlhttp.onreadystatechange = function() { if ( xmlhttp.readyState === 4) { var data = JSON.parse( xmlhttp.response ); // Render response } } }
function updateSelectedQuote( selectedQuoteId ){ var updateURL = roomContext.url + '/records';
var opportunityRecord = {}; opportunityRecord.id = roomContext.masterRecordId; opportunityRecord.type = "Opportunity"; opportunityRecord.fields = {}; opportunityRecord.fields["CustomerSelectedQuote__c"] = selectedQuoteId;
var updateRequest = {}; updateRequest.method = "UPDATE"; updateRequest.type = "Opportunity"; updateRequest.records = []; updateRequest.records.push( opportunityRecord )
var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", updateURL ); xmlhttp.setRequestHeader("Content-Type", "application/json"); xmlhttp.setRequestHeader("Authorization", roomContext.sessionId); xmlhttp.send(JSON.stringify( updateRequest ) ); xmlhttp.onreadystatechange = function() { if ( xmlhttp.readyState === 4) { var response = JSON.parse( xmlhttp.response ); if( response.success == false ){ // Handle response.message and response.errors here } // Render response } } }</script>