local lud = require "ludweb"
local schema = [[
CREATE TABLE IF NOT EXISTS User (
id INTEGER PRIMARY KEY AUTOINCREMENT,
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 UNIQUE,
desc TEXT
);
CREATE TABLE IF NOT EXISTS Membership (
proj_id INTEGER REFERENCES Project(id),
user_id INTEGER REFERENCES User(id),
PRIMARY KEY(proj_id, user_id)
);
CREATE TABLE IF NOT EXISTS State (
id INTEGER PRIMARY KEY AUTOINCREMENT,
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,
desc TEXT
);
CREATE TABLE IF NOT EXISTS Shift (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticket_id INTEGER NOT NULL REFERENCES Ticket(id),
old_stt_id INTEGER NOT NULL REFERENCES State(id),
new_stt_id INTEGER NOT NULL REFERENCES State(id),
user_id INTEGER NOT NULL REFERENCES User(id),
time INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS Comment (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticket_id INTEGER NOT NULL REFERENCES Ticket(id),
user_id INTEGER NOT NULL REFERENCES User(id),
time INTEGER NOT NULL,
text TEXT NOT NULL
);
]]
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}