Source: src/js/collections/QualityReport.js

define([
  "jquery",
  "underscore",
  "backbone",
  "rdflib",
  "uuid",
  "md5",
  "models/QualityCheckModel",
], function ($, _, Backbone, rdf, uuid, md5, QualityCheck) {
  /**
     @class QualityReport
     @classdesc A DataPackage represents a hierarchical collection of
     packages, metadata, and data objects, modeling an OAI-ORE RDF graph.
     TODO: incorporate Backbone.UniqueModel
     * @classcategory Collections
     @extends Backbone.Collection
     @constructor
    */
  var QualityReport = Backbone.Collection.extend(
    /** @lends QualityReport.prototype */ {
      //The name of this type of collection
      type: "QualityReport",
      runStatus: null,
      errorDescription: null,
      timestamp: null,

      initialize: function (models, options) {
        if (typeof options == "undefined") var options = {};

        //Set the id or create a new one
        this.id = options.pid || "urn:uuid:" + uuid.v4();

        //this.on("add", this.handleAdd);
        //this.on("successSaving", this.updateRelationships);

        return this;
      },

      /*
       * The QualityReport collection stores a metadata quality
       * report that is generated from the MetaDIG quality engine.
       */
      model: QualityCheck,

      parse: function (response, options) {
        // runStatus can be one of "success", "failure", "queued"
        this.runStatus = response.runStatus;
        this.errorDescription = response.errorDescription;
        this.timestamp = response.timestamp;
        return response.result;
      },

      fetch: function (options) {
        var collectionRef = this;
        var fetchOptions = {};
        if (typeof options != "undefined") {
          fetchOptions = _.extend(options, {
            url: options.url,
            cache: false,
            contentType: false, //"multipart/form-data",
            processData: false,
            type: "GET",
            //headers: { 'Access-Control-Allow-Origin': 'http://localhost:8081' },
            headers: {
              Accept: "application/json",
            },
            success: function (collection, jqXhr, options) {
              //collectionRef.run = data;
              collectionRef.trigger("fetchComplete");
            },
            error: function (collection, jqXhr, options) {
              console.debug("error fetching quality report.");
              collectionRef.fetchResponse = jqXhr;
              collectionRef.trigger("fetchError");
            },
          });
          //fetchOptions = _.extend(fetchOptions, MetacatUI.appUserModel.createAjaxSettings());
          return Backbone.Collection.prototype.fetch.call(
            collectionRef,
            fetchOptions,
          );
        }
      },

      groupResults: function (results) {
        var groupedResults = _.groupBy(results, function (result) {
          var color;

          var check = result.get("check");
          var status = result.get("status");
          // simple cases
          // always blue for info and skip
          if (check.level == "INFO") {
            color = "BLUE";
            return color;
          }
          if (status == "SKIP") {
            color = "BLUE";
            return color;
          }
          // always green for success
          if (status == "SUCCESS") {
            color = "GREEN";
            return color;
          }

          // handle failures and warnings
          if (status == "FAILURE") {
            color = "RED";
            if (check.level == "OPTIONAL") {
              color = "ORANGE";
            }
          }
          if (status == "ERROR") {
            color = "ORANGE";
            if (check.level == "REQUIRED") {
              color = "RED";
            }
          }
          return color;
        });

        // make sure we have everything, even if empty
        if (!groupedResults.BLUE) {
          groupedResults.BLUE = [];
        }
        if (!groupedResults.GREEN) {
          groupedResults.GREEN = [];
        }
        if (!groupedResults.ORANGE) {
          groupedResults.ORANGE = [];
        }
        if (!groupedResults.RED) {
          groupedResults.RED = [];
        }

        //if (groupedResults.BLUE) {
        //  total = total - groupedResults.BLUE.length;
        //}

        return groupedResults;
      },

      groupByType: function (results) {
        var groupedResults = _.groupBy(results, function (result) {
          var check = result.get("check");
          var status = result.get("status");

          if (status == "ERROR" || status == "SKIP") {
            // orange or blue
            return "removeMe";
          }
          if (status == "FAILURE" && check.level == "OPTIONAL") {
            // orange
            return "removeMe";
          }

          var type = "";
          // Convert check type to lower case, so that the checks will be
          // grouped correctly, even if one check type has an incorrect capitalization.
          if (check.type != null) {
            // Normalize check type by converting entire string to lowercase
            type = check.type.toLowerCase();
            // Now convert to title case
            type = type.charAt(0).toUpperCase() + type.slice(1);
          }

          return type || "uncategorized";
        });

        // get rid of the ones that should not be counted in our totals
        delete groupedResults["removeMe"];

        return groupedResults;
      },
    },
  );
  return QualityReport;
});