UNPKG

jsforce

Version:

Salesforce API Library for JavaScript

200 lines (178 loc) 5.72 kB
/** * @file Manages Salesforce Analytics API * @author Shinichi Tomita <shinichi.tomita@gmail.com> */ 'use strict'; var _ = require('lodash/core'), jsforce = require('../core'), 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); }; /** * Explain plan for executing report * * @method Analytics~Report#explain * @param {Callback.<ExplainInfo>} [callback] - Callback function * @returns {Promise.<ExplainInfo>} */ Report.prototype.explain = function(callback) { var url = "/query/?explain=" + this.id; 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('/'); url += "?includeDetails=" + (options.details ? "true" : "false"); 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, body: "" }; 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); }; /*--------------------------------------------*/ /* * Register hook in connection instantiation for dynamically adding this API module features */ jsforce.on('connection:new', function(conn) { conn.analytics = new Analytics(conn); }); module.exports = Analytics;