/**
* Copyright© 2016, Oracle and/or its affiliates. All rights reserved.
* Created by ddrobins on 7/28/15.
*/
/**
* This class provides a way to invoke custom API endpoints for the
* currently active mobile backend. Callers should use
* MobileBackend's [CustomCode()]{@link MobileBackend#CustomCode} property.
* @constructor
* @private
* @global
*/
function CustomCode(backend, utils, platform) {
/**
* Callback invoked after successfully flushing analytics events.
* @callback CustomCode~successCallback
* @deprecated Use promises instead
*/
/**
* Callback invoked on error.
* @callback CustomCode~errorCallback
* @param statusCode {Number} Any HTTP status code returned from the server, if available.
* @param message {String} The HTTP payload from the server, if available, or an error message.
* @deprecated Use promises instead
*/
/**
* @ignore
* @type {{GET: string, POST: string, PUT: string, DELETE: string, PATCH: string}}
*/
var httpMethods = {GET: 'GET', POST: 'POST', PUT: 'PUT', DELETE: 'DELETE', PATCH: 'PATCH'};
var _backend = backend;
function checkParameters(params, comparison) {
return isJSON(params) && params && params != undefined && typeof params == comparison;
}
function isJSON(params) {
if (typeof params != 'string')
params = JSON.stringify(params);
try {
JSON.parse(params);
return true;
} catch (e) {
return false;
}
}
/**
* Allows the user to call custom Code defined on the UI and assigned to the backend defined by the user
* This custom endpoint should return data only in JSON format.
* @param path {String} The path of the endpoint following the platform prefix, i.e. {BaseUrl}/mobile/custom/{path to the custom API endpoint}.
* @param method {String} HTTP method that is invoked.
* @param data {Object} Data that is inserted into the call on the server for POST and PUT methods. Only accepts a JSON object and/or JavaScript array.
* @param [successCallback] {CustomCode~successCallback} Optional callback invoked on success that returns the status code and the data from the request (deprecated use promises instead).
* @param [errorCallback] {CustomCode~errorCallback} Optional callback invoked on failure that returns the status code and the data from the request (deprecated use promises instead).
* @return {Promise.<NetworkResponse|NetworkResponse>}
* @example path: "TasksAPI/tasks/100"
* @example method: "GET,POST,PUT,DELETE"
* @example data: {
"name": "Complete reports",
"completed": false,
"priority": "high",
"dueDate": "2015-03-15T17:00:00Z"
}
* These methods must be defined in the custom API for these methods to work.
* @example <caption>Example usage of mcs.MobileBackend.invokeCustomCodeJSONRequest()</caption>
mcs.MobileBackend.customCode
.invokeCustomCodeJSONRequest('TaskApi1/tasks/100' ,'GET' ,null)
.then(invokeSuccess, invokeError);
function invokeSuccess(response) {
console.log(response.data);// returns object in JSON format
}
function invokeError(response) {
}
//output
{
"name": "Complete reports",
"completed": false,
"priority": "high",
"dueDate": "2015-03-15T17:00:00Z"
}
*/
this.invokeCustomCodeJSONRequest = function (path, method, data, successCallback, errorCallback) {
if (method in httpMethods) {
if(method === httpMethods.DELETE && data){
if (errorCallback != null) {
errorCallback(500, 'DELETE method content body');
return undefined;
} else {
return Promise.reject(new NetworkResponse(500, 'DELETE method content body'));
}
}
var headers = _backend.getHttpHeaders(utils.MODULE_NAMES.CUSTOM_CODE);
headers[utils.HEADERS.CONTENT_TYPE] = 'application/json';
var customData = data ? JSON.stringify(data) : null;
return platform.invokeService({
method: method,
url: _backend.getCustomCodeUrl(path),
headers: headers,
data: customData
}).then(invokeServiceSuccess, invokeServiceError);
} else {
if (errorCallback != null) {
errorCallback(501, 'Method Not Implemented');
return undefined;
} else {
return Promise.reject(new NetworkResponse(501, 'Method Not Implemented'));
}
}
function invokeServiceSuccess(response) {
if (successCallback) {
successCallback(response.statusCode, response.data, response.headers);
}
return response;
}
function invokeServiceError(response) {
if (errorCallback) {
errorCallback(response.statusCode, response.data);
} else {
return Promise.reject(response);
}
}
};
}