An extremely simple time-tracking API.

app.moon 1.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. lapis = require "lapis"
  2. import Sessions, Deltas from require "models"
  3. import api, abort from require "helpers"
  4. -- returns a Session (creating if needed) and list of Deltas
  5. get = (id="") ->
  6. if session = Sessions\find(:id) or Sessions\create(:id)
  7. return session, Deltas\select "WHERE session_id = ?", session.id
  8. else
  9. abort "Invalid session ID."
  10. -- returns a hash table of accumulated time from a list of Deltas
  11. types = (deltas={}) ->
  12. tab = {}
  13. for delta in *deltas
  14. if tab[delta.type]
  15. tab[delta.type] += delta.time
  16. else
  17. tab[delta.type] = delta.time
  18. return tab if #tab > 0
  19. -- converts Session and Deltas list into a returnable result
  20. result = (session, deltas) ->
  21. {
  22. id: session.id, time: session.updated_at - session.started_at,
  23. types: types deltas
  24. }
  25. -- core function of an update (POST or PUT) request
  26. update = =>
  27. session, deltas = get(@params.id)
  28. session, delta = session\update(@params)
  29. table.insert deltas, delta if delta
  30. return result session, deltas
  31. -- core function of a DELETE request
  32. delete = =>
  33. session = get(@params.id)
  34. ok, err = session\delete!
  35. abort err unless ok
  36. return deleted: true
  37. -- all request methods are technically usable (not not neccessarily useful) on both routes
  38. fns = {
  39. GET: api(=> result get(@params.id))
  40. POST: api(=> update(@))
  41. PUT: api(=> update(@))
  42. DELETE: api(=> delete(@))
  43. }
  44. class extends lapis.Application
  45. -- can access a session by its id in the URL, or generate one with /0/new
  46. [session: "/0/:id[a-fA-F%d]"]: fns
  47. [new_session: "/0/new"]: fns