Source: src/js/collections/ObjectFormats.js

"use strict";

define([
  "jquery",
  "underscore",
  "backbone",
  "x2js",
  "models/formats/ObjectFormat",
], function ($, _, Backbone, X2JS, ObjectFormat) {
  /**
   * @class ObjectFormats
   * @classdesc ObjectFormats represents the DataONE object format list
   * found at https://cn.dataone.org/cn/v2/formats, or
   * the Coordinating Node environment configured `AppModel.d1CNBaseUrl`
   * This collection is intended to be used as a formats cache -
   * retrieved once, and only refreshed later if an object format
   * isn't present when needed.
   * @classcategory Collections
   * @extends Backbone.Collection
   * @constructor
   */
  var ObjectFormats = Backbone.Collection.extend(
    /** @lends ObjectFormats.prototype */ {
      model: ObjectFormat,

      /**
       * The constructed URL of the collection
       * (/cn/v2/formats)
       * @returns {string} - The URL to use during fetch
       */
      url: function () {
        // no need for authentication token, just the URL
        return MetacatUI.appModel.get("formatsServiceUrl");
      },

      /**
       * Retrieve the formats from the Coordinating Node
       * @extends Backbone.Collection#fetch
       */
      fetch: function (options) {
        var fetchOptions = _.extend({ dataType: "text" }, options);

        return Backbone.Model.prototype.fetch.call(this, fetchOptions);
      },

      /**
       * Parse the XML response from the CN
       */
      parse: function (response) {
        // If the collection is already parsed, just return it
        if (typeof response === "object") return response;

        // Otherwise, parse it
        var x2js = new X2JS();
        var formats = x2js.xml_str2json(response);

        return formats.objectFormatList.objectFormat;
      },
    },
  );

  return ObjectFormats;
});