dt0/app.moon

56 lines
1.5 KiB
Plaintext
Raw Normal View History

2018-09-09 23:29:56 +00:00
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
2018-09-09 23:29:56 +00:00
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={}) ->
2018-09-09 23:29:56 +00:00
tab = {}
for delta in *deltas
if tab[delta.type]
tab[delta.type] += delta.time
else
tab[delta.type] = delta.time
2018-09-09 23:29:56 +00:00
return tab if #tab > 0
-- converts Session and Deltas list into a returnable result
2018-09-09 23:29:56 +00:00
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
2018-09-09 23:29:56 +00:00
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
2018-09-09 23:29:56 +00:00
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
2018-09-09 23:29:56 +00:00
fns = {
GET: api(=> result get(@params.id))
POST: api(=> update(@))
PUT: api(=> update(@))
DELETE: api(=> delete(@))
2018-09-09 23:29:56 +00:00
}
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