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}