UNPKG

angular-cached-resource

Version:

An AngularJS module to interact with RESTful resources, even when browser is offline

75 lines (72 loc) 2.72 kB
// 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; }; };