12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- lapis = require "lapis"
-
- import Sessions, Deltas from require "models"
- import api, abort from require "helpers"
-
- -- returns a Session (creating if needed) and list of Deltas
- get = (id="") ->
- if session = Sessions\find(:id) or Sessions\create(:id)
- return session, Deltas\select "WHERE session_id = ?", session.id
- else
- abort "Invalid session ID."
-
- -- returns a hash table of accumulated time from a list of Deltas
- types = (deltas={}) ->
- tab = {}
- for delta in *deltas
- if tab[delta.type]
- tab[delta.type] += delta.time
- else
- tab[delta.type] = delta.time
- return tab if #tab > 0
-
- -- converts Session and Deltas list into a returnable result
- result = (session, deltas) ->
- {
- id: session.id, time: session.updated_at - session.started_at,
- types: types deltas
- }
-
- -- core function of an update (POST or PUT) request
- update = =>
- session, deltas = get(@params.id)
- session, delta = session\update(@params)
- table.insert deltas, delta if delta
- return result session, deltas
-
- -- core function of a DELETE request
- delete = =>
- session = get(@params.id)
- ok, err = session\delete!
- abort err unless ok
- return deleted: true
-
- -- all request methods are technically usable (not not neccessarily useful) on both routes
- fns = {
- GET: api(=> result get(@params.id))
- POST: api(=> update(@))
- PUT: api(=> update(@))
- DELETE: api(=> delete(@))
- }
-
- class extends lapis.Application
- -- can access a session by its id in the URL, or generate one with /0/new
- [session: "/0/:id[a-fA-F%d]"]: fns
- [new_session: "/0/new"]: fns
|