lib/generators/databound/install/templates/databound-standalone.js
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();