UNPKG

2.28 kBtext/coffeescriptView Raw
1modifyObjectInPlace = require './modify_object_in_place'
2
3module.exports = writeCache = ($q, providerParams, action, CachedResource, actionConfig) ->
4 ResourceCacheEntry = require('./resource_cache_entry')(providerParams)
5
6 ->
7 # according to the ngResource documentation:
8 # Resource.action([parameters], postData, [success], [error])
9 # or
10 # resourceInstance.action([parameters], [success], [error])
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