Source: src/js/models/analytics/Analytics.js

define(["backbone"], function (Backbone) {
  /**
   * @class Analytics
   * @classdesc A model that connects with an analytics service to record user
   * interactions with the app. This is a generic model that is meant to be
   * extended for a specific analytics service.
   * @classcategory Models/Analytics
   * @extends Backbone.Model
   * @constructs
   * @since 2.25.0
   */
  var Analytics = Backbone.Model.extend(
    /** @lends Analytics.prototype */
    {
      /**
       * The name of this Model
       * @name Analytics#type
       * @type {string}
       * @readonly
       */
      type: "Analytics",

      /**
       * Default attributes for this model
       * @type {object}
       * @returns {object}
       */
      defaults: function () {
        return {};
      },

      /**
       * Creates a new Analytics model
       */
      initialize: function (attributes, options) {
        this.setupAnalytics();
      },

      /**
       * Set up the analytics service.
       */
      setupAnalytics: function () {
        return;
      },

      /**
       * Get the key for the analytics service. This is the ID that is used to
       * initialize the analytics service.
       * @returns {string} The key for the analytics service
       */
      getKey: function () {
        return "";
      },

      /**
       * Get the version number of the MetacatUI app.
       * @returns {string} The version number of the MetacatUI app
       */
      getVersion: function () {
        return MetacatUI.metacatUIVersion || "unknown";
      },

      /**
       * The main function for sending analytics events to the service.
       * @type {function}
       */
      track: null,

      /**
       * Check if analytics service is enabled and ready to use.
       * @returns {boolean} True if the service is enabled in the app and the
       * track method is available.
       */
      ready: function () {
        return false;
      },

      /**
       * Given a message and an optional ID, create a description of an
       * exception event that can be sent to an analytics service.
       * @param {string} message - A description of the exception
       * @param {string} id - The ID for the associated package or object
       * @returns {string} A description of the exception event
       */
      createExceptionDescription: function (message, id) {
        const version = this.getVersion();
        const sep = ` | `;
        const desc = `${message}`;
        if (id) desc += `${sep}Id: ${id}`;
        desc += `${sep}v. ${version}`;
        return desc;
      },

      /**
       * Send the details of an exception event to an analytics service. This
       * will automatically include the MetacatUI version number in the event
       * details. The function will do nothing if an analytics service is not
       * enabled.
       * @param {string} message - A description of the exception
       * @param {string} id - The ID for the associated package or object
       * @param {boolean} fatal - Whether the exception was fatal
       */
      trackException: function (message, id, fatal) {
        return;
      },

      /**
       * Send the details of an event to an analytics service. The function will
       * do nothing if an analytics service is not enabled.
       * @param {string} category - The category of the event
       * @param {string} action - The action of the event
       * @param {string} label - The label of the event
       * @param {string} value - The value of the event
       */
      trackEvent: function (category, action, label, value) {
        return;
      },

      /**
       * Send the details of a page view to an analytics service. The function
       * will do nothing if an analytics service is not enabled.
       * @param {string} path - The path of the page
       * @param {string} title - The title of the page
       */
      trackPageView: function (path, title) {
        return;
      },
    },
  );

  return Analytics;
});