/**
* @file Manages Salesforce Analytics API
* @author Shinichi Tomita <shinichi.tomita@gmail.com>
*/
var _ = require('underscore')._,
Promise = require('./promise');
/**
* Report instance to retrieving asynchronously executed result
*
* @protected
* @class Analytics~ReportInstance
* @param {Analytics~Report} report - Report
* @param {String} id - Report instance id
*/
var ReportInstance = function(report, id) {
this._report = report;
this._conn = report._conn;
this.id = id;
};
/**
* Retrieve report result asynchronously executed
*
* @method Analytics~ReportInstance#retrieve
* @param {Callback.<Analytics~ReportResult>} [callback] - Callback function
* @returns {Promise.<Analytics~ReportResult>}
*/
ReportInstance.prototype.retrieve = function(callback) {
var conn = this._conn,
report = this._report;
var url = [ conn._baseUrl(), "analytics", "reports", report.id, "instances", this.id ].join('/');
return conn._request(url).thenCall(callback);
};
/**
* Report object in Analytics API
*
* @protected
* @class Analytics~Report
* @param {Connection} conn Connection
*/
var Report = function(conn, id) {
this._conn = conn;
this.id = id;
};
/**
* Describe report metadata
*
* @method Analytics~Report#describe
* @param {Callback.<Analytics~ReportMetadata>} [callback] - Callback function
* @returns {Promise.<Analytics~ReportMetadata>}
*/
Report.prototype.describe = function(callback) {
var url = [ this._conn._baseUrl(), "analytics", "reports", this.id, "describe" ].join('/');
return this._conn._request(url).thenCall(callback);
};
/**
* Run report synchronously
*
* @method Analytics~Report#execute
* @param {Object} [options] - Options
* @param {Boolean} options.details - Flag if include detail in result
* @param {Analytics~ReportMetadata} options.metadata - Overriding report metadata
* @param {Callback.<Analytics~ReportResult>} [callback] - Callback function
* @returns {Promise.<Analytics~ReportResult>}
*/
Report.prototype.run =
Report.prototype.exec =
Report.prototype.execute = function(options, callback) {
options = options || {};
if (_.isFunction(options)) {
callback = options;
options = {};
}
var url = [ this._conn._baseUrl(), "analytics", "reports", this.id ].join('/');
if (options.details) {
url += "?includeDetails=true";
}
var params = { method : options.metadata ? 'POST' : 'GET', url : url };
if (options.metadata) {
params.headers = { "Content-Type" : "application/json" };
params.body = JSON.stringify(options.metadata);
}
return this._conn._request(params).thenCall(callback);
};
/**
* Run report asynchronously
*
* @method Analytics~Report#executeAsync
* @param {Object} [options] - Options
* @param {Boolean} options.details - Flag if include detail in result
* @param {Analytics~ReportMetadata} options.metadata - Overriding report metadata
* @param {Callback.<Analytics~ReportInstanceAttrs>} [callback] - Callback function
* @returns {Promise.<Analytics~ReportInstanceAttrs>}
*/
Report.prototype.executeAsync = function(options, callback) {
options = options || {};
if (_.isFunction(options)) {
callback = options;
options = {};
}
var url = [ this._conn._baseUrl(), "analytics", "reports", this.id, "instances" ].join('/');
if (options.details) {
url += "?includeDetails=true";
}
var params = { method : 'POST', url : url };
if (options.metadata) {
params.headers = { "Content-Type" : "application/json" };
params.body = JSON.stringify(options.metadata);
}
return this._conn._request(params).thenCall(callback);
};
/**
* Get report instance for specified instance ID
*
* @method Analytics~Report#instance
* @param {String} id - Report instance ID
* @returns {Analytics~ReportInstance}
*/
Report.prototype.instance = function(id) {
return new ReportInstance(this, id);
};
/**
* List report instances which had been executed asynchronously
*
* @method Analytics~Report#instances
* @param {Callback.<Array.<Analytics~ReportInstanceAttrs>>} [callback] - Callback function
* @returns {Promise.<Array.<Analytics~ReportInstanceAttrs>>}
*/
Report.prototype.instances = function(callback) {
var url = [ this._conn._baseUrl(), "analytics", "reports", this.id, "instances" ].join('/');
return this._conn._request(url).thenCall(callback);
};
/**
* API class for Analytics API
*
* @class
* @param {Connection} conn Connection
*/
var Analytics = function(conn) {
this._conn = conn;
};
/**
* Get report object of Analytics API
*
* @param {String} id - Report Id
* @returns {Analytics~Report}
*/
Analytics.prototype.report = function(id) {
return new Report(this._conn, id);
};
/**
* Get recent report list
*
* @param {Callback.<Array.<Analytics~ReportInfo>>} [callback] - Callback function
* @returns {Promise.<Array.<Analytics~ReportInfo>>}
*/
Analytics.prototype.reports = function(callback) {
var url = [ this._conn._baseUrl(), "analytics", "reports" ].join('/');
return this._conn._request(url).thenCall(callback);
};
module.exports = Analytics;