1 |
|
2 | var modifyObjectInPlace, writeCache;
|
3 |
|
4 | modifyObjectInPlace = require('./modify_object_in_place');
|
5 |
|
6 | module.exports = writeCache = function($q, providerParams, action, CachedResource, actionConfig) {
|
7 | var ResourceCacheEntry;
|
8 | ResourceCacheEntry = require('./resource_cache_entry')(providerParams);
|
9 | return function() {
|
10 | var args, cacheEntry, data, deferred, error, instanceMethod, isArray, isDirty, param, params, queueDeferred, resource, success, value, wrapInCachedResource, _i, _len, _ref;
|
11 | instanceMethod = this instanceof CachedResource;
|
12 | args = Array.prototype.slice.call(arguments);
|
13 | params = !instanceMethod && angular.isObject(args[1]) ? args.shift() : instanceMethod && angular.isObject(args[0]) ? args.shift() : {};
|
14 | data = instanceMethod ? this : args.shift();
|
15 | success = args[0], error = args[1];
|
16 | isArray = angular.isArray(data);
|
17 | isDirty = !actionConfig.cacheOnly;
|
18 | wrapInCachedResource = function(object) {
|
19 | if (object instanceof CachedResource) {
|
20 | return object;
|
21 | } else {
|
22 | return new CachedResource(object);
|
23 | }
|
24 | };
|
25 | if (isArray) {
|
26 | data = data.map(function(o) {
|
27 | return wrapInCachedResource(o);
|
28 | });
|
29 | for (_i = 0, _len = data.length; _i < _len; _i++) {
|
30 | resource = data[_i];
|
31 | cacheEntry = new ResourceCacheEntry(CachedResource.$key, resource.$params()).load();
|
32 | if (!angular.equals(cacheEntry.data, resource)) {
|
33 | cacheEntry.set(resource, isDirty);
|
34 | }
|
35 | }
|
36 | } else {
|
37 | data = wrapInCachedResource(data);
|
38 | _ref = data.$params();
|
39 | for (param in _ref) {
|
40 | value = _ref[param];
|
41 | params[param] = value;
|
42 | }
|
43 | cacheEntry = new ResourceCacheEntry(CachedResource.$key, data.$params()).load();
|
44 | if (!angular.equals(cacheEntry.data, data)) {
|
45 | cacheEntry.set(data, isDirty);
|
46 | }
|
47 | }
|
48 | data.$resolved = false;
|
49 | deferred = $q.defer();
|
50 | data.$promise = deferred.promise;
|
51 | if (angular.isFunction(success)) {
|
52 | deferred.promise.then(success);
|
53 | }
|
54 | if (angular.isFunction(error)) {
|
55 | deferred.promise["catch"](error);
|
56 | }
|
57 | if (actionConfig.cacheOnly) {
|
58 | data.$resolved = true;
|
59 | deferred.resolve(data);
|
60 | } else {
|
61 | queueDeferred = $q.defer();
|
62 | queueDeferred.promise.then(function(httpResource) {
|
63 | cacheEntry.load();
|
64 | modifyObjectInPlace(data, httpResource, cacheEntry.value);
|
65 | data.$resolved = true;
|
66 | return deferred.resolve(data);
|
67 | });
|
68 | queueDeferred.promise["catch"](deferred.reject);
|
69 | CachedResource.$writes.enqueue(params, data, action, queueDeferred);
|
70 | CachedResource.$writes.flush();
|
71 | }
|
72 | return data;
|
73 | };
|
74 | };
|