/**
* @file Manages Salesforce Apex REST endpoint calls
* @author Shinichi Tomita <shinichi.tomita@gmail.com>
*/
'use strict';
var jsforce = require('../core');
/**
* API class for Apex REST endpoint call
*
* @class
* @param {Connection} conn Connection
*/
var Apex = function(conn) {
this._conn = conn;
};
/**
* @private
*/
Apex.prototype._baseUrl = function() {
return this._conn.instanceUrl + "/services/apexrest";
};
/**
* @private
*/
Apex.prototype._createRequestParams = function(method, path, body, options) {
var params = {
method: method,
url: this._baseUrl() + path
},
_headers = {};
if(options && 'object' === typeof options['headers']){
_headers = options['headers'];
}
if (!/^(GET|DELETE)$/i.test(method)) {
_headers["Content-Type"] = "application/json";
}
params.headers = _headers;
if (body) {
params.body = JSON.stringify(body);
}
return params;
};
/**
* Call Apex REST service in GET request
*
* @param {String} path - URL path to Apex REST service
* @param {Object} options - Holds headers and other meta data for the request.
* @param {Callback.<Object>} [callback] - Callback function
* @returns {Promise.<Object>}
*/
Apex.prototype.get = function(path, options, callback) {
if (typeof options === 'function') {
callback = options;
options = undefined;
}
return this._conn.request(this._createRequestParams('GET', path, undefined, options)).thenCall(callback);
};
/**
* Call Apex REST service in POST request
*
* @param {String} path - URL path to Apex REST service
* @param {Object} [body] - Request body
* @param {Object} options - Holds headers and other meta data for the request.
* @param {Callback.<Object>} [callback] - Callback function
* @returns {Promise.<Object>}
*/
Apex.prototype.post = function(path, body, options, callback) {
if (typeof body === 'function') {
callback = body;
body = undefined;
options = undefined;
}
if (typeof options === 'function') {
callback = options;
options = undefined;
}
var params = this._createRequestParams('POST', path, body, options);
return this._conn.request(params).thenCall(callback);
};
/**
* Call Apex REST service in PUT request
*
* @param {String} path - URL path to Apex REST service
* @param {Object} [body] - Request body
* @param {Object} [options] - Holds headers and other meta data for the request.
* @param {Callback.<Object>} [callback] - Callback function
* @returns {Promise.<Object>}
*/
Apex.prototype.put = function(path, body, options, callback) {
if (typeof body === 'function') {
callback = body;
body = undefined;
options = undefined;
}
if (typeof options === 'function') {
callback = options;
options = undefined;
}
var params = this._createRequestParams('PUT', path, body, options);
return this._conn.request(params).thenCall(callback);
};
/**
* Call Apex REST service in PATCH request
*
* @param {String} path - URL path to Apex REST service
* @param {Object} [body] - Request body
* @param {Object} [options] - Holds headers and other meta data for the request.
* @param {Callback.<Object>} [callback] - Callback function
* @returns {Promise.<Object>}
*/
Apex.prototype.patch = function(path, body, options, callback) {
if (typeof body === 'function') {
callback = body;
body = undefined;
options = undefined;
}
if (typeof options === 'function') {
callback = options;
options = undefined;
}
var params = this._createRequestParams('PATCH', path, body, options);
return this._conn.request(params).thenCall(callback);
};
/**
* Synonym of Apex#delete()
*
* @method Apex#del
*
* @param {String} path - URL path to Apex REST service
* @param {Object} [body] - Request body
* @param {Callback.<Object>} [callback] - Callback function
* @returns {Promise.<Object>}
*/
/**
* Call Apex REST service in DELETE request
*
* @method Apex#delete
*
* @param {String} path - URL path to Apex REST service
* @param {Object} [body] - Request body
* @param {Object} [options] - Holds headers and other meta data for the request.
* @param {Callback.<Object>} [callback] - Callback function
* @returns {Promise.<Object>}
*/
Apex.prototype.del =
Apex.prototype["delete"] = function(path, options, callback) {
if (typeof options === 'function') {
callback = options;
options = undefined;
}
return this._conn.request(this._createRequestParams('DELETE', path, undefined, options)).thenCall(callback);
};
/*--------------------------------------------*/
/*
* Register hook in connection instantiation for dynamically adding this API module features
*/
jsforce.on('connection:new', function(conn) {
conn.apex = new Apex(conn);
});
module.exports = Apex;