aboutsummaryrefslogtreecommitdiff
path: root/schema.sql
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-02-12 00:33:41 +0800
committerRunxi Yu <me@runxiyu.org>2025-02-12 00:41:02 +0800
commit7692d5ae5b6a5e45f8661b58822557e72f34f246 (patch)
treeab8b0bc5b323b4639160d9482213477f7bb1ee3d /schema.sql
parentconfig.go, etc.: Add PostgreSQL (diff)
downloadforge-7692d5ae5b6a5e45f8661b58822557e72f34f246.tar.gz
forge-7692d5ae5b6a5e45f8661b58822557e72f34f246.tar.zst
forge-7692d5ae5b6a5e45f8661b58822557e72f34f246.zip
schema.sql: Basic schema
Diffstat (limited to 'schema.sql')
-rw-r--r--schema.sql71
1 files changed, 71 insertions, 0 deletions
diff --git a/schema.sql b/schema.sql
new file mode 100644
index 0000000..f8fe980
--- /dev/null
+++ b/schema.sql
@@ -0,0 +1,71 @@
+CREATE TABLE groups (
+ id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
+ name TEXT NOT NULL UNIQUE
+);
+
+CREATE TABLE repos (
+ id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
+ group_id INTEGER NOT NULL REFERENCES groups(id) ON DELETE RESTRICT, -- I mean, should be CASCADE but deleting Git repos on disk also needs to be considered
+ name TEXT NOT NULL,
+ UNIQUE(group_id, name),
+ description TEXT,
+ filesystem_path TEXT
+);
+
+CREATE TABLE ticket_trackers (
+ id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
+ group_id INTEGER NOT NULL REFERENCES groups(id) ON DELETE RESTRICT,
+ name TEXT NOT NULL,
+ UNIQUE(group_id, name),
+ description TEXT
+);
+
+CREATE TABLE tickets (
+ id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
+ tracker_id INTEGER NOT NULL REFERENCES ticket_trackers(id) ON DELETE CASCADE,
+ title TEXT NOT NULL,
+ description TEXT
+);
+
+CREATE TABLE mailing_lists (
+ id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
+ group_id INTEGER NOT NULL REFERENCES groups(id) ON DELETE RESTRICT,
+ name TEXT NOT NULL,
+ UNIQUE(group_id, name),
+ description TEXT
+);
+
+CREATE TABLE emails (
+ id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
+ list_id INTEGER NOT NULL REFERENCES mailing_lists(id) ON DELETE CASCADE,
+ title TEXT NOT NULL,
+ from TEXT NOT NULL,
+ date TIMESTAMP,
+ content BYTEA
+);
+
+CREATE TABLE merge_requests (
+ id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
+ repo_id INTEGER NOT NULL REFERENCES repos(id) ON DELETE CASCADE,
+ creator INTEGER REFERENCES users(id) ON DELETE SET NULL,
+ source_ref TEXT NOT NULL,
+ destination_branch TEXT NOT NULL,
+ status TEXT NOT NULL CHECK (status IN ('open', 'merged', 'closed')),
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ mailing_list_id INT UNIQUE REFERENCES mailing_lists(id) ON DELETE CASCADE
+);
+
+CREATE TABLE users (
+ id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
+ username TEXT NOT NULL UNIQUE,
+ password_algorithm TEXT NOT NULL CHECK (password_algorithm in ('argon2id')),
+ password TEXT NOT NULL
+);
+
+CREATE TABLE ssh_public_keys (
+ id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
+ user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
+ content TEXT NOT NULL,
+ UNIQUE (user_id, content)
+);