UNPKG

d2

Version:

Javascript library for DHIS2

87 lines (76 loc) 3.02 kB
import AnalyticsRequestDimensionsMixin from './AnalyticsRequestDimensionsMixin' import AnalyticsRequestFiltersMixin from './AnalyticsRequestFiltersMixin' import AnalyticsRequestPropertiesMixin from './AnalyticsRequestPropertiesMixin' import AnalyticsRequestBase from './AnalyticsRequestBase' /** * @description * Class for constructing a request object to use for communicating with the analytics API endpoint. * * @param {!Object} options Object with analytics request options * * @memberof module:analytics * * @extends module:analytics.AnalyticsRequestDisensionsMixin * @extends module:analytics.AnalyticsRequestFiltersMixin * @extends module:analytics.AnalyticsRequestPropertiesMixin * @extends module:analytics.AnalyticsRequestBase */ class AnalyticsRequest extends AnalyticsRequestDimensionsMixin( AnalyticsRequestFiltersMixin( AnalyticsRequestPropertiesMixin(AnalyticsRequestBase) ) ) { /** * Extracts dimensions and filters from an analytic object model and add them to the request * * @param {Object} model The analytics object model from which extract the dimensions/filters * @param {Boolean} [passFilterAsDimension=false] Pass filters as dimension in the query string (used in dataValueSet requests) * * @returns {AnalyticsRequest} A new instance of the class for chaining purposes * * @example * const req = new d2.analytics.request() * .fromModel(model); * * // dimension=pe:LAST_12_MONTH&dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU;Jtf34kNZhzP;hfdmMSPBgLG&filter=ou:ImspTQPwCqd * * const req2 = new d2.analytics.request() * .fromModel(model, true); * * // dimension=pe:LAST_12_MONTH&dimension=dx:fbfJHSPpUQD;cYeuwXTCPkU;Jtf34kNZhzP;hfdmMSPBgLG&dimension=ou:ImspTQPwCqd */ fromModel(model, passFilterAsDimension = false) { let request = this // extract dimensions from model const columns = model.columns || [] const rows = model.rows || [] columns.concat(rows).forEach(d => { let { dimension } = d if (d.filter) { dimension += `:${d.filter}` } request = request.addDimension( dimension, d.items.map(item => item.id) ) }) // extract filters from model const filters = model.filters || [] // only pass dx/pe/ou as dimension const fixedIds = ['dx', 'ou', 'pe'] filters.forEach(f => { request = passFilterAsDimension && fixedIds.includes(f.dimension) ? request.addDimension( f.dimension, f.items.map(item => item.id) ) : request.addFilter( f.dimension, f.items.map(item => item.id) ) }) return request } } export default AnalyticsRequest