bq/corbel-js

View on GitHub
src/assets/assets-builder.js

Summary

Maintainability
A
3 hrs
Test Coverage
//@exclude
'use strict';
//@endexclude

(function() {

  /**
   * Module for organize user assets
   * @exports AssetsBuilder
   * @namespace
   * @extends corbel.Services
   * @memberof corbel.Assets
   */
  var AssetsBuilder = corbel.Assets.AssetsBuilder = corbel.Services.inherit({

    /**
     * Creates a new AssetsBuilder
     * @memberof corbel.Assets.AssetsBuilder.prototype
     * @param  {string}                         id string with the asset id or `all` key
     * @return {corbel.Assets.AssetsBuilder}
     */
    constructor: function(driver, id) {
      this.driver = driver;
      this.uri = 'asset';
      this.id = id;
    },

    /**
     * Gets my user assets
     * @memberof corbel.Assets.AssetsBuilder.prototype
     * @param  {object} [params]      Params of a {@link corbel.request}
     * @return {Promise}              Promise that resolves with an Asset or rejects with a {@link CorbelError}
     */
    get: function(params) {

      var options = params ? corbel.utils.clone(params) : {};

      var args = corbel.utils.extend(options, {
        url: this._buildUri(this.uri, this.id),
        method: corbel.request.method.GET,
        query: params ? corbel.utils.serializeParams(params) : null
      });

      return this.request(args);

    },

   /**
     * Gets all assets
     * @memberof corbel.Assets.AssetsBuilder.prototype
     * @param  {object} [params]      Params of a {@link corbel.request}
     * @return {Promise}              Promise that resolves with an Asset or rejects with a {@link CorbelError}
     */
     getAll: function(params){
      var options = params ? corbel.utils.clone(params) : {};

      var args = corbel.utils.extend(options, {
        url: this._buildUri(this.uri, 'all'),
        method: corbel.request.method.GET,
        query: params ? corbel.utils.serializeParams(params) : null
      });
      return this.request(args);
    },

    /**
     * Delete asset
     * @memberof corbel.Assets.AssetsBuilder.prototype
     * @return {Promise}                Promise that resolves to undefined (void) or rejects with a {@link CorbelError}
     */
    delete: function() {
      corbel.validate.value('id', this.id);
      return this.request({
        url: this._buildUri(this.uri, this.id),
        method: corbel.request.method.DELETE
      });
    },

    /**
     * Creates a new asset
     * @memberof corbel.Assets.AssetsBuilder.prototype
     * @param {object}  data            Contains the data of the new asset
     * @param {string}  data.userId     The user id
     * @param {string}  data.name       The asset name
     * @param {date}    data.expire     Expire date
     * @param {boolean} data.active     If asset is active
     * @param {array}   data.scopes     Scopes of the asset
     * @return {Promise}                Promise that resolves in the new asset id or rejects with a {@link CorbelError}
     */
    create: function(data) {
      return this.request({
        url: this._buildUri(this.uri),
        method: corbel.request.method.POST,
        data: data
      }).
      then(function(res) {
        return corbel.Services.getLocationId(res);
      });
    },

    /**
     * Generates a JWT that contains the scopes of the actual user's assets and redirects to iam to upgrade user's token
     * @memberof corbel.Assets.AssetsBuilder.prototype
     * @return {Promise} Promise that resolves to a redirection to iam/oauth/token/upgrade or rejects with a {@link CorbelError}
     */
    access: function(params) {
      var args = params ? corbel.utils.clone(params) : {};
      args.url = this._buildUri(this.uri + '/access');
      args.method = corbel.request.method.GET;
      args.noRedirect = true;

      var that = this;

      return this.request(args).
      then(function(response) {
        return that.request({
          noRetry: args.noRetry,
          method: corbel.request.method.POST,
          contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
          data:response.data,
          url: response.headers.location
        });
      });
    },

    _buildUri: function(path, id) {
      var uri = '';
      var urlBase =  this.driver.config.getCurrentEndpoint(corbel.Assets.moduleName, this._buildPort(this.driver.config));

      uri = urlBase + path;
      if (id) {
        uri += '/' + id;
      }
      return uri;
    },

    _buildPort: function(config) {
      return config.get('assetsPort', null) || corbel.Assets.defaultPort;
    }

  }, {

    /**
     * GET constant
     * @constant
     * @memberof corbel.Assets.AssetsBuilder
     * @type {string}
     * @default
     */
    moduleName: 'assets',

    /**
     * Factory
     * @memberof corbel.Assets.AssetsBuilder
     * @type {string}
     * @default
     */
    create: function(driver) {
      return new corbel.Assets.AssetsBuilder(driver);
    }

  });

  return AssetsBuilder;

})();