angular-cached-resource
Version:
An AngularJS module to interact with RESTful resources, even when browser is offline
75 lines (72 loc) • 2.72 kB
JavaScript
// Generated by CoffeeScript 1.10.0
var modifyObjectInPlace, writeCache;
modifyObjectInPlace = require('./modify_object_in_place');
module.exports = writeCache = function($q, providerParams, action, CachedResource, actionConfig) {
var ResourceCacheEntry;
ResourceCacheEntry = require('./resource_cache_entry')(providerParams);
return function() {
var args, cacheEntry, data, deferred, error, i, instanceMethod, isArray, isDirty, len, param, params, queueDeferred, ref, resource, success, value, wrapInCachedResource;
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);
isDirty = !actionConfig.cacheOnly;
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, isDirty);
}
}
} 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, isDirty);
}
}
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);
}
if (actionConfig.cacheOnly) {
data.$resolved = true;
deferred.resolve(data);
} else {
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;
};
};