analytics/Analytics.js

/**
 * @module analytics
 */
import AnalyticsAggregate from './AnalyticsAggregate'
import AnalyticsEvents from './AnalyticsEvents'
import AnalyticsRequest from './AnalyticsRequest'
import AnalyticsResponse from './AnalyticsResponse'

/**
 * @description
 * Analytics class used to request analytics data from Web API.
 *
 * @requires analytics.AnalyticsAggregate
 * @requires analytics.AnalyticsEvents
 * @requires analytics.AnalyticsRequest
 * @requires analytics.AnalyticsResponse
 *
 * @example
 * const d2Analytics = new Analytics(
 *  new AnalyticsAggregate(),
 *  new AnalyticsEvents(),
 *  AnalyticsRequest,
 *  AnalyticsResponse
 * )
 *
 * @memberof module:analytics
 * @see {@link https://docs.dhis2.org/master/en/developer/html/webapi_analytics.html} Analytics API documentation
 * @see {@link https://docs.dhis2.org/master/en/developer/html/webapi_event_analytics.html} Event analytics API documentation
 */
class Analytics {
    /**
     * @param {!module:analytics.AnalyticsAggregate} analyticsAggregate The AnalyticsAggregate instance
     * @param {!module:analytics.AnalyticsEvents} analyticsEvents The AnalyticsEvents instance
     * @param {!module:analytics.AnalyticsRequest} analyticsRequest The AnalyticsRequest class
     * @param {!module:analytics.AnalyticsResponse} analyticsResponse The AnalyticsResponse class
     */
    constructor(
        analyticsAggregate,
        analyticsEvents,
        analyticsRequest,
        analyticsResponse
    ) {
        this.aggregate = analyticsAggregate
        this.events = analyticsEvents
        this.request = analyticsRequest
        this.response = analyticsResponse
    }

    /**
     * @static
     *
     * @description
     * Get a new instance of the Analytics object. This will function as a singleton, once Analytics object
     * has been created when requesting getAnalytics again the original version will be returned.
     *
     * @returns {Analytics} Object with the analytics interaction properties
     *
     * @example
     * const d2Analytics = d2.getAnalytics();
     */
    static getAnalytics() {
        if (!Analytics.getAnalytics.analytics) {
            Analytics.getAnalytics.analytics = new Analytics(
                new AnalyticsAggregate(),
                new AnalyticsEvents(),
                AnalyticsRequest,
                AnalyticsResponse
            )
        }

        return Analytics.getAnalytics.analytics
    }
}

export default Analytics