From fa116e3650807c21a2767176746d90e81a65ce15 Mon Sep 17 00:00:00 2001 From: Paul Liverman III Date: Sun, 16 Sep 2018 12:03:56 -0700 Subject: [PATCH] bug fixes, notes, removed non-functioning console --- Dockerfile | 2 -- app.moon | 30 ++++++++++++++++++------------ helpers.moon | 10 +++++----- models/Sessions.moon | 4 ++++ 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/Dockerfile b/Dockerfile index fc24179..75ee362 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1 @@ FROM guard13007/docker-lapis:latest - -RUN luarocks install lapis-console diff --git a/app.moon b/app.moon index 1cd6422..cdde3e3 100644 --- a/app.moon +++ b/app.moon @@ -1,49 +1,55 @@ lapis = require "lapis" -console = require "lapis.console" 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." -types = (deltas) -> +-- returns a hash table of accumulated time from a list of Deltas +types = (deltas={}) -> tab = {} for delta in *deltas - tab[delta.type] = delta.time + 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: => result get(@params.id) - POST: => update(@) - PUT: => update(@) - DELETE: => delete(@) + GET: api(=> result get(@params.id)) + POST: api(=> update(@)) + PUT: api(=> update(@)) + DELETE: api(=> delete(@)) } class extends lapis.Application - [console: "/console/#{config.secret}"]: => - return console.make(env: "all")(@) - - [session: "/0/:id[a-fA-F%d]"]: api fns - [new_session: "/0/new"]: api fns + -- 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 diff --git a/helpers.moon b/helpers.moon index 662c3cf..bddcc2b 100644 --- a/helpers.moon +++ b/helpers.moon @@ -2,17 +2,17 @@ import json_params, capture_errors, yield_error, respond_to from require "lapis. import insert from table import max from math -api = (tab) -> +api = (fn) => json_params capture_errors { => - result = respond_to(tab) - return json: result, + result = fn(@) + return json: result on_error: => - status = 400 + status = 400 -- most likely a bad request errors = {} for err in *@errors if "table" == type err - status = max status, err[1] + status = max status, err[1] -- the worst error will have a higher status number insert errors, err[2] else insert errors, err diff --git a/models/Sessions.moon b/models/Sessions.moon index d3c8f51..d047ac0 100644 --- a/models/Sessions.moon +++ b/models/Sessions.moon @@ -7,10 +7,12 @@ import abort from require "helpers" class Sessions extends Model @create: (input) => + -- make sure a unique id is generated id = input.id or to_hex bytes 16 while Sessions\find id: id id = to_hex bytes 16 + -- take user input time or when this request started processing time = tonumber(input.started_at) or ngx.req.start_time! values = { started_at: time @@ -20,6 +22,8 @@ class Sessions extends Model return super values @update: (input) => + -- user can manually change started_at and updated_at if they want + -- this will potentially invalidate data in the Deltas values = { started_at: tonumber(input.started_at) or nil updated_at: tonumber(input.updated_at) or ngx.req.start_time!