Browse Source

initial version woop woop

Paul Liverman III 5 years ago
commit
4a95f69e5b
8 changed files with 152 additions and 0 deletions
  1. 1
    0
      Dockerfile
  2. 45
    0
      app.moon
  3. 12
    0
      config.moon
  4. 8
    0
      create
  5. 34
    0
      helpers.moon
  6. 15
    0
      migrations.moon
  7. 4
    0
      models/Deltas.moon
  8. 33
    0
      models/Sessions.moon

+ 1
- 0
Dockerfile View File

@@ -0,0 +1 @@
1
+FROM guard13007/docker-lapis:latest

+ 45
- 0
app.moon View File

@@ -0,0 +1,45 @@
1
+lapis = require "lapis"
2
+
3
+import Sessions, Deltas from require "models"
4
+import api, abort from require "helpers"
5
+
6
+get = (id="") ->
7
+  if session = Sessions\find(:id) or Sessions\create(:id)
8
+    return session, Deltas\select "WHERE session_id = ?", session.id
9
+  else
10
+    abort "Invalid session ID."
11
+
12
+types = (deltas) ->
13
+  tab = {}
14
+  for delta in *deltas
15
+    tab[delta.type] = delta.time
16
+  return tab if #tab > 0
17
+
18
+result = (session, deltas) ->
19
+  {
20
+    id: session.id, time: session.updated_at - session.started_at,
21
+    types: types deltas
22
+  }
23
+
24
+update = =>
25
+  session, deltas = get(@params.id)
26
+  session, delta = session\update(@params)
27
+  table.insert deltas, delta if delta
28
+  return result session, deltas
29
+
30
+delete = =>
31
+  session = get(@params.id)
32
+  ok, err = session\delete!
33
+  abort err unless ok
34
+  return deleted: true
35
+
36
+fns = {
37
+  GET: => result get(@params.id)
38
+  POST: => update(@)
39
+  PUT: => update(@)
40
+  DELETE: => delete(@)
41
+}
42
+
43
+class extends lapis.Application
44
+  [session: "/0/:id[a-fA-F%d]"]: api fns
45
+  [new_session: "/0/new"]: api fns

+ 12
- 0
config.moon View File

@@ -0,0 +1,12 @@
1
+config = require "lapis.config"
2
+
3
+postgres_password = os.getenv "POSTGRES_PASSWORD"
4
+
5
+config "development", ->
6
+  postgres ->
7
+    host "dt-db"
8
+    user "postgres"
9
+    database "postgres"
10
+    password postgres_password
11
+  num_workers 2
12
+  code_cache "on"

+ 8
- 0
create View File

@@ -0,0 +1,8 @@
1
+#!/usr/bin/env bash
2
+docker build -t dt0 .
3
+docker network create dt-db
4
+docker run -d --restart always --name dt-db --network dt-db \
5
+  -v "$PWD/db":/var/lib/postgresql/data postgres:10.5-alpine
6
+docker run -d --restart always --name dt0 --network dt-db \
7
+  dt0:latest
8
+docker network connect web dt0

+ 34
- 0
helpers.moon View File

@@ -0,0 +1,34 @@
1
+import json_params, capture_errors, yield_error, respond_to from require "lapis.application"
2
+import insert from table
3
+import max from math
4
+
5
+api = (tab) ->
6
+  json_params capture_errors {
7
+    respond_to(tab),
8
+    on_error: =>
9
+      status = 400
10
+      errors = {}
11
+      for err in *@errors
12
+        if "table" == type err
13
+          status = max status, err[1]
14
+          insert errors, err[2]
15
+        else
16
+          insert errors, err
17
+      return(:status, json: { success: false, :errors })
18
+  }
19
+
20
+abort = (status, message) ->
21
+  if message
22
+    yield_error {status, message}
23
+  else
24
+    yield_error status
25
+
26
+assert_model = (result, err) ->
27
+  abort 500, err if err
28
+  return result
29
+
30
+{
31
+  :api
32
+  :abort
33
+  :assert_model
34
+}

+ 15
- 0
migrations.moon View File

@@ -0,0 +1,15 @@
1
+import create_table, types from require "lapis.db.schema"
2
+
3
+{
4
+  [1535648305]: =>
5
+    create_table "sessions", {
6
+      {"id", types.varchar primary_key: true, unique: true}
7
+      {"started_at", types.double}
8
+      {"updated_at", types.double}
9
+    }
10
+    create_table "deltas", {
11
+      {"session_id", types.varchar primary_key: true}
12
+      {"type", types.varchar}
13
+      {"time", types.double}
14
+    }
15
+}

+ 4
- 0
models/Deltas.moon View File

@@ -0,0 +1,4 @@
1
+import Model from require "lapis.db.model"
2
+
3
+class Deltas extends Model
4
+  @primary_key: "session_id"

+ 33
- 0
models/Sessions.moon View File

@@ -0,0 +1,33 @@
1
+import Model from require "lapis.db.model"
2
+
3
+import Deltas from require "models"
4
+import bytes from require "resty.random"
5
+import to_hex from require "resty.string"
6
+import abort from require "helpers"
7
+
8
+class Sessions extends Model
9
+  @create: (input) =>
10
+    id = input.id or to_hex bytes 16
11
+    while Sessions\find id: id
12
+      id = to_hex bytes 16
13
+
14
+    time = tonumber(input.started_at) or ngx.req.start_time!
15
+    values = {
16
+      started_at: time
17
+      updated_at: time
18
+      id: id
19
+    }
20
+    return super values
21
+
22
+  @update: (input) =>
23
+    values = {
24
+      started_at: tonumber(input.started_at) or nil
25
+      updated_at: tonumber(input.updated_at) or ngx.req.start_time!
26
+    }
27
+    local delta
28
+    if input.type
29
+      delta, err = Deltas\create session_id: @id, type: input.type, time: values.updated_at - @updated_at
30
+      unless delta
31
+        -- abort "Invalid type (must be <=255 bytes)."
32
+        abort "Failed to create delta: #{err}"
33
+    return super(values), delta