angular-cached-resource
Version:
An AngularJS module to interact with RESTful resources, even when browser is offline
69 lines (66 loc) • 2.53 kB
JavaScript
// Generated by CoffeeScript 1.7.1
var modifyObjectInPlace, writeCache;
modifyObjectInPlace = require('./modify_object_in_place');
module.exports = writeCache = function($q, providerParams, action, CachedResource) {
var ResourceCacheEntry;
ResourceCacheEntry = require('./resource_cache_entry')(providerParams);
return function() {
var args, cacheEntry, data, deferred, error, instanceMethod, isArray, param, params, queueDeferred, resource, success, value, wrapInCachedResource, _i, _len, _ref;
instanceMethod = this instanceof CachedResource;
args = Array.prototype.slice.call(arguments);
params = !instanceMethod && angular.isObject(args[1]) ? args.shift() : instanceMethod && angular.isObject(args[0]) ? args.shift() : {};
data = instanceMethod ? this : args.shift();
success = args[0], error = args[1];
isArray = angular.isArray(data);
wrapInCachedResource = function(object) {
if (object instanceof CachedResource) {
return object;
} else {
return new CachedResource(object);
}
};
if (isArray) {
data = data.map(function(o) {
return wrapInCachedResource(o);
});
for (_i = 0, _len = data.length; _i < _len; _i++) {
resource = data[_i];
cacheEntry = new ResourceCacheEntry(CachedResource.$key, resource.$params()).load();
if (!angular.equals(cacheEntry.data, resource)) {
cacheEntry.set(resource, true);
}
}
} else {
data = wrapInCachedResource(data);
_ref = data.$params();
for (param in _ref) {
value = _ref[param];
params[param] = value;
}
cacheEntry = new ResourceCacheEntry(CachedResource.$key, data.$params()).load();
if (!angular.equals(cacheEntry.data, data)) {
cacheEntry.set(data, true);
}
}
data.$resolved = false;
deferred = $q.defer();
data.$promise = deferred.promise;
if (angular.isFunction(success)) {
deferred.promise.then(success);
}
if (angular.isFunction(error)) {
deferred.promise["catch"](error);
}
queueDeferred = $q.defer();
queueDeferred.promise.then(function(httpResource) {
cacheEntry.load();
modifyObjectInPlace(data, httpResource, cacheEntry.value);
data.$resolved = true;
return deferred.resolve(data);
});
queueDeferred.promise["catch"](deferred.reject);
CachedResource.$writes.enqueue(params, data, action, queueDeferred);
CachedResource.$writes.flush();
return data;
};
};