angular-cached-resource
Version:
An AngularJS module to interact with RESTful resources, even when browser is offline
66 lines (55 loc) • 2.28 kB
text/coffeescript
modifyObjectInPlace = require './modify_object_in_place'
module.exports = writeCache = ($q, providerParams, action, CachedResource, actionConfig) ->
ResourceCacheEntry = require('./resource_cache_entry')(providerParams)
->
# according to the ngResource documentation:
# Resource.action([parameters], postData, [success], [error])
# or
# resourceInstance.action([parameters], [success], [error])
instanceMethod = @ instanceof CachedResource
args = Array::slice.call arguments
params =
if not instanceMethod and angular.isObject(args[1])
args.shift()
else if instanceMethod and angular.isObject(args[0])
args.shift()
else
{}
data = if instanceMethod then @ else args.shift()
[success, error] = args
isArray = angular.isArray(data)
isDirty = not actionConfig.cacheOnly
wrapInCachedResource = (object) ->
if object instanceof CachedResource
object
else
new CachedResource object
if isArray
data = data.map((o) -> wrapInCachedResource o)
for resource in data
cacheEntry = new ResourceCacheEntry(CachedResource.$key, resource.$params()).load()
cacheEntry.set(resource, isDirty) unless angular.equals(cacheEntry.data, resource)
else
data = wrapInCachedResource data
params[param] = value for param, value of data.$params()
cacheEntry = new ResourceCacheEntry(CachedResource.$key, data.$params()).load()
cacheEntry.set(data, isDirty) unless angular.equals(cacheEntry.data, data)
data.$resolved = false
deferred = $q.defer()
data.$promise = deferred.promise
deferred.promise.then success if angular.isFunction(success)
deferred.promise.catch error if angular.isFunction(error)
if actionConfig.cacheOnly
data.$resolved = true
deferred.resolve(data)
else
queueDeferred = $q.defer()
queueDeferred.promise.then (httpResource) ->
cacheEntry.load()
modifyObjectInPlace(data, httpResource, cacheEntry.value)
data.$resolved = true
deferred.resolve(data)
queueDeferred.promise.catch deferred.reject
CachedResource.$writes.enqueue(params, data, action, queueDeferred)
CachedResource.$writes.flush()
data