login

<     >

2023-07-22 12:17:18 (UTC-03:00)

Marcel Rodrigues <marcelgmr@gmail.com>

add basic DB read functions

diff --git a/data.lua b/data.lua
index 63425ea..3f496bb 100644
--- a/data.lua
+++ b/data.lua
@@ -1,14 +1,16 @@
+local lud = require "ludweb"
+
 local schema = [[
 CREATE TABLE IF NOT EXISTS User (
     id INTEGER PRIMARY KEY AUTOINCREMENT,
-    nick TEXT NOT NULL,
+    nick TEXT NOT NULL UNIQUE,
     name TEXT NOT NULL,
     salt TEXT,
     hash TEXT
 );
 CREATE TABLE IF NOT EXISTS Project (
     id INTEGER PRIMARY KEY AUTOINCREMENT,
-    name TEXT NOT NULL,
+    name TEXT NOT NULL UNIQUE,
     desc TEXT
 );
 CREATE TABLE IF NOT EXISTS Membership (
@@ -18,12 +20,13 @@ CREATE TABLE IF NOT EXISTS Membership (
 );
 CREATE TABLE IF NOT EXISTS State (
     id INTEGER PRIMARY KEY AUTOINCREMENT,
-    name TEXT NOT NULL
+    name TEXT NOT NULL UNIQUE
 );
 CREATE TABLE IF NOT EXISTS Ticket (
     id INTEGER PRIMARY KEY AUTOINCREMENT,
     proj_id INTEGER NOT NULL REFERENCES Project(id),
     user_id INTEGER NOT NULL REFERENCES User(id),
+    state_id INTEGER NOT NULL REFERENCES State(id),
     time INTEGER NOT NULL,
     code INTEGER NOT NULL,
     name TEXT NOT NULL,
@@ -46,4 +49,53 @@ CREATE TABLE IF NOT EXISTS Comment (
 );
 ]]
 
-return {schema=schema}
+local Model = {}
+Model.__index = Model
+
+function Model:create_tables()
+    self.db:execute_many(schema)
+end
+
+function Model:create_states()
+    self.db:execute[[
+        INSERT INTO State(name) VALUES
+        ("backlog"), ("design"), ("progress"), ("review"), ("done");
+    ]]
+end
+
+function Model:get_user(nick)
+    return self.db:execute("SELECT * FROM User WHERE nick = ?;", nick)[1]
+end
+
+function Model:get_user_projects(user_id)
+    return self.db:execute([[
+        SELECT * FROM Project JOIN Membership ON Project.id = Membership.proj_id
+        WHERE Membership.user_id = ?;
+    ]], user_id)
+end
+
+function Model:get_states()
+    return self.db:execute("SELECT * FROM State;")
+end
+
+function Model:get_tickets(proj_id, state_id)
+    -- TODO: limit "done" tickets by age
+    local query = "SELECT * FROM Ticket WHERE proj_id = ? AND state_id = ?;"
+    return self.db:execute(query, proj_id, state_id)
+end
+
+function Model:get_comments(ticket_id)
+    return self.db:execute("SELECT * FROM Comment WHERE ticket_id = ?;", ticket_id)
+end
+
+function Model:close()
+    self.db:close()
+end
+
+local function open(path)
+    local self = setmetatable({path=path}, Model)
+    self.db = lud.sqlite.open(path)
+    return self
+end
+
+return {open=open}