OSDN Git Service

merge:
[pettanr/pettanr.git] / app / assets / javascripts / pettanr / cache.js.coffee
1 class Pettanr.Cache\r
2   \r
3   constructor: (options) ->\r
4     @data = {}\r
5     _.extend(this, Backbone.Events)\r
6   \r
7   # return cached items\r
8   store: (items) ->\r
9     if _.isArray(items)\r
10       return_items = _.map items, (item) =>\r
11         r = @restore(item.cache_key())\r
12         r = @store(item) if !r\r
13         r\r
14     else\r
15       item = items\r
16       cached_item = @restore(item.cache_key())\r
17       return_items = if cached_item\r
18         cached_item  # merge?\r
19       else\r
20         @data[item.cache_key()] = item\r
21       @refresh(return_items)\r
22     return_items\r
23   \r
24   restore: (key) ->\r
25     k = if _.isString(key)\r
26       key\r
27     else\r
28       key.cache_key()\r
29     item = @data[k]\r
30     #if item\r
31     #  @refresh(item)\r
32   \r
33   retrieve: (model, id, force) ->\r
34     empty_item = new model({id: id})\r
35     if force\r
36       # query\r
37       empty_item.fetch().done =>\r
38         @trigger('retrieve', empty_item)\r
39     else if id\r
40       # existence item\r
41       item = @store(empty_item)\r
42       if item\r
43         @trigger('retrieve', item)\r
44       else\r
45         empty_item.fetch().done =>\r
46           @store(empty_item)\r
47           @trigger('retrieve', empty_item)\r
48     else\r
49       # new item\r
50       @trigger('retrieve', empty_item)\r
51   \r
52   edit: (model, id) ->\r
53     @listenTo(this, 'retrieve', @edit_retrieve)\r
54     @retrieve(model, id)\r
55   \r
56   edit_retrieve: (item) ->\r
57     editting_item = item.clone()\r
58     # get latest item\r
59     editting_item.fetch().done =>\r
60       @trigger('edit', editting_item)\r
61   \r
62   refresh: (item) ->\r
63     if item.expire_time\r
64       if Date.now() >= return_items.expire_time\r
65         @sync(item)\r
66     item\r
67   \r
68   sync: (item) ->\r
69     item.fetch().done =>\r
70       item.expire_time.setTime(Date.now() + 10 * 60 * 1000)\r
71   \r
72 class Pettanr.Cache.Retriever\r
73   \r
74   constructor: (@model, @id) ->\r
75     _.extend(this, Backbone.Events)\r
76   \r
77   retrieve: (force) ->\r
78     empty_item = new @model({id: @id})\r
79     if force\r
80       # query\r
81       empty_item.fetch().done =>\r
82         @trigger('retrieve', empty_item)\r
83     else if @id\r
84       # existence item\r
85       item = Pettanr.cache.restore(empty_item)\r
86       if item\r
87         @trigger('retrieve', item)\r
88       else\r
89         empty_item.fetch().done =>\r
90           Pettanr.cache.store(empty_item)\r
91           @trigger('retrieve', empty_item)\r
92     else\r
93       # new item\r
94       @trigger('retrieve', empty_item)\r
95   \r