Source: src/js/models/projects/Project.js

define(["jquery", "backbone"], function ($, Backbone) {
  "use strict";
  /**
   * @class Project
   * @classdesc A Project model represents a single instance of a project. This can be
   *          used for a projects list view populating EML projects. It also supports loading
   *          projects from a third-party API in case projects information is located outside of
   *          metacat.
   * @classcategory Models/Projects
   * @since 2.22.0
   * @extends Backbone.Model
   */

  var Project = Backbone.Model.extend(
    /** @lends Project.prototype */ {
      idAttribute: "id",
      defaults: {
        // Set the project model attributes defaults here.
        id: undefined,
        title: undefined,
      },
      authToken: undefined,
      urlBase: undefined,

      /** Builds  from the urlBase **/
      urlRoot: function () {
        if (this.urlBase) {
          return new URL(
            new URL(this.urlBase).pathname + this.urlEndpoint,
            this.urlBase,
          ).href;
        } else {
          return undefined;
        }
      },
      /**
       * Override backbone's parse to set the data after the request returns from the server
       */
      parse: function (response, options) {
        // Add any custom data structure code here.
        return response;
      },
      /**
       * Override backbone's sync to set the auth token
       */
      sync: function (method, model, options) {
        if (this.authToken) {
          if (options.headers === undefined) {
            options.headers = {};
          }
          options.headers["Authorization"] = "Bearer " + this.authToken;
        }

        if (this.urlBase)
          return Backbone.Model.prototype.sync.apply(this, [
            method,
            model,
            options,
          ]);
      },
      /**
       * Initializing the Model objects project variables. The projects are retrieved from the
       * model url service
       */
      initialize: function (options) {
        if (MetacatUI && MetacatUI.appModel)
          this.urlBase = MetacatUI.appModel.get("projectsApiUrl");
        if (options.authToken) this.authToken = options.authToken;
        if (options.urlBase) this.urlBase = options.urlBase;

        Backbone.Model.prototype.initialize.apply(this, options);
      },
    },
  );
  return Project;
});