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