Nedomas/databound-rails

View on GitHub
lib/generators/databound/install/templates/databound-standalone.js

Summary

Maintainability
A
0 mins
Test Coverage
var Databound, DataboundError,
  __slice = [].slice;

Databound = (function() {
  function Databound(endpoint, scope, options) {
    this.endpoint = endpoint;
    this.scope = scope != null ? scope : {};
    this.options = options != null ? options : {};
    this.extra_where_scopes = this.options.extra_where_scopes || [];
    this.records = [];
    this.seeds = [];
    this.properties = [];
  }

  Databound.API_URL = "";

  Databound.prototype.request = function(action, params) {
    return jQuery.post(this.url(action), this.data(params), 'json');
  };

  Databound.prototype.promise = function(result) {
    var deferred;
    deferred = jQuery.Deferred();
    deferred.resolve(result);
    return deferred.promise();
  };

  Databound.prototype.where = function(params) {
    var _this;
    _this = this;
    return this.wrappedRequest('where', params).then(function(resp) {
      var records;
      records = JSON.parse(resp.records).concat(_this.seeds);
      _this.records = _.sortBy(records, 'id');
      return _this.promise(_this.records);
    });
  };

  Databound.prototype.all = function() {
    return this.where();
  };

  Databound.prototype.find = function(id) {
    var _this;
    this.checkUndefinedId('find', id);
    _this = this;
    return this.where({
      id: id
    }).then(function() {
      var record;
      record = _this.take(id);
      if (!record) {
        throw new DataboundError("Couldn't find record with id: " + id);
      }
      return _this.promise(record);
    });
  };

  Databound.prototype.findBy = function(params) {
    var _this;
    _this = this;
    return this.where(params).then(function(resp) {
      return _this.promise(_.first(_.values(resp)));
    });
  };

  Databound.prototype.create = function(params) {
    return this.requestAndRefresh('create', params);
  };

  Databound.prototype.update = function(params) {
    return this.requestAndRefresh('update', params);
  };

  Databound.prototype.destroy = function(id) {
    this.checkUndefinedId('destroy', id);
    return this.requestAndRefresh('destroy', {
      id: id
    });
  };

  Databound.prototype.take = function(id) {
    return _.detect(this.records, function(record) {
      return id.toString() === record.id.toString();
    });
  };

  Databound.prototype.takeAll = function() {
    return this.records;
  };

  Databound.prototype.injectSeedRecords = function(records) {
    return this.seeds = records;
  };

  Databound.prototype.requestAndRefresh = function(action, params) {
    var _this;
    _this = this;
    return this.wrappedRequest(action, params).then(function(resp) {
      var records, records_with_seeds;
      records = JSON.parse(resp.scoped_records);
      records_with_seeds = records.concat(_this.seeds);
      _this.records = _.sortBy(records_with_seeds, 'id');
      if (resp.id) {
        return _this.promise(_this.take(resp.id));
      } else {
        return _this.promise(resp.success);
      }
    });
  };

  Databound.prototype.url = function(action) {
    if (_.isEmpty(Databound.API_URL)) {
      return "" + this.endpoint + "/" + action;
    } else {
      return "" + Databound.API_URL + "/" + this.endpoint + "/" + action;
    }
  };

  Databound.prototype.data = function(params) {
    return {
      scope: JSON.stringify(this.scope),
      extra_where_scopes: JSON.stringify(this.extra_where_scopes),
      data: JSON.stringify(params)
    };
  };

  Databound.prototype.wrappedRequest = function() {
    var args;
    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
    return this.request.apply(this, args).then(_.bind(this.handleSuccess, this)).fail(this.handleFailure);
  };

  Databound.prototype.handleSuccess = function(resp) {
    if (!(resp != null ? resp.success : void 0)) {
      throw new Error('Error in the backend');
    }
    return this.promise(resp);
  };

  Databound.prototype.handleFailure = function(e) {
    if (e.status === DataboundError.STATUS) {
      throw new DataboundError(e.responseJSON.message);
    } else {
      throw new Error("Error in the backend with status " + e.status);
    }
  };

  Databound.prototype.checkUndefinedId = function(action, id) {
    if (!_.isUndefined(id)) {
      return;
    }
    throw new DataboundError("Couldn't " + action + " a record without an id");
  };

  return Databound;

})();

DataboundError = (function() {
  function DataboundError(text) {
    this.message = "Databound: " + text;
  }

  DataboundError.STATUS = 405;

  return DataboundError;

})();

DataboundError.prototype = new Error();