class Pettanr.Cache constructor: (options) -> @operators = options.operators @data = {} @holds = {} _.extend(this, Backbone.Events) # return cached items store: (items) -> if _.isArray(items) return_items = _.map items, (item) => r = @restore(item.cache_key()) r = @store(item) if !r r else item = items cached_item = @restore(item.cache_key()) return_items = if cached_item cached_item # merge? else @data[item.cache_key()] = item @refresh(return_items) return_items restore: (key) -> k = if _.isString(key) key else key.cache_key() item = @data[k] #if item # @refresh(item) is_hold: (item) -> if @holds[item.cache_key()] true else false hold: (item) -> return @holds[item.cache_key()] if @holds[item.cache_key()] @holds[item.cache_key()] = item.clone() fix: (item) -> delete @holds[item.cache_key()] @restore(item).fetch() release: (item) -> delete @holds[item.cache_key()] refresh: (item) -> @restore(item.cache_key()).fetch() #if item.expire_time # if Date.now() >= return_items.expire_time # @sync(item) #item sync: (item) -> item.fetch().done => item.expire_time.setTime(Date.now() + 10 * 60 * 1000) class Pettanr.Cache.Retriever constructor: (@model, @id) -> _.extend(this, Backbone.Events) retrieve: (force) -> empty_item = new @model({id: @id}) if force # query (ex: folders/3?watch) @retrieve_force(empty_item) else if @id # existence item item = Pettanr.cache.restore(empty_item) if item @trigger('retrieve', item) else empty_item.fetch().done => Pettanr.cache.store(empty_item) @trigger('retrieve', empty_item) else # new item @trigger('retrieve', empty_item) retrieve_force: (item) -> item.fetch().done => @trigger('retrieve', item) edit: (options = {}) -> empty_item = new @model({id: @id}) item = empty_item.hold() if options.with_elements item = item.with_elements() item.fetch().done => if options.with_elements item.attributes = item.replaced_attributes({hold: true}) @trigger('retrieve', item)