206 item = st.deserialize(item); |
206 item = st.deserialize(item); |
207 return key, item, when, with; |
207 return key, item, when, with; |
208 end, count; |
208 end, count; |
209 end |
209 end |
210 |
210 |
|
211 function archive:get(username, wanted_key) |
|
212 local iter, err = self:find(username, { key = wanted_key }) |
|
213 if not iter then return iter, err; end |
|
214 for key, stanza, when, with in iter do |
|
215 if key == wanted_key then |
|
216 return stanza, when, with; |
|
217 end |
|
218 end |
|
219 return nil, "item-not-found"; |
|
220 end |
|
221 |
|
222 function archive:set(username, key, new_value, new_when, new_with) |
|
223 local items, err = datamanager.list_load(username, host, self.store); |
|
224 if not items then |
|
225 if err then |
|
226 return items, err; |
|
227 else |
|
228 return nil, "item-not-found"; |
|
229 end |
|
230 end |
|
231 |
|
232 for i = 1, #items do |
|
233 local old_item = items[i]; |
|
234 if old_item.key == key then |
|
235 local item = st.preserialize(st.clone(new_value)); |
|
236 |
|
237 local when = new_when or item.when or datetime.parse(item.attr.stamp); |
|
238 item.key = key; |
|
239 item.when = when; |
|
240 item.with = new_with or old_item.with; |
|
241 item.attr.stamp = datetime.datetime(when); |
|
242 item.attr.stamp_legacy = datetime.legacy(when); |
|
243 items[i] = item; |
|
244 return datamanager.list_store(username, host, self.store, items); |
|
245 end |
|
246 end |
|
247 |
|
248 return nil, "item-not-found"; |
|
249 end |
|
250 |
211 function archive:dates(username) |
251 function archive:dates(username) |
212 local items, err = datamanager.list_load(username, host, self.store); |
252 local items, err = datamanager.list_load(username, host, self.store); |
213 if not items then return items, err; end |
253 if not items then return items, err; end |
214 return array(items):pluck("when"):map(datetime.date):unique(); |
254 return array(items):pluck("when"):map(datetime.date):unique(); |
215 end |
255 end |