schema.sql
Raw
1CREATE TABLE IF NOT EXISTS users (
2 id INTEGER PRIMARY KEY AUTOINCREMENT,
3 username TEXT UNIQUE NOT NULL,
4 password_hash TEXT,
5 created_at TEXT NOT NULL,
6 avatar_version INTEGER NOT NULL DEFAULT 1,
7 git_name TEXT,
8 git_email TEXT
9);
10
11CREATE TABLE IF NOT EXISTS passkeys (
12 id INTEGER PRIMARY KEY AUTOINCREMENT,
13 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
14 credential_id TEXT UNIQUE NOT NULL,
15 public_key TEXT NOT NULL,
16 counter INTEGER NOT NULL DEFAULT 0,
17 created_at TEXT NOT NULL
18);
19
20CREATE TABLE IF NOT EXISTS sessions (
21 id TEXT PRIMARY KEY,
22 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
23 expires_at TEXT NOT NULL,
24 created_at TEXT NOT NULL
25);
26
27CREATE TABLE IF NOT EXISTS repositories (
28 id INTEGER PRIMARY KEY AUTOINCREMENT,
29 name TEXT UNIQUE NOT NULL,
30 description TEXT,
31 is_private INTEGER NOT NULL DEFAULT 0,
32 is_pinned INTEGER NOT NULL DEFAULT 0,
33 default_branch TEXT NOT NULL DEFAULT 'main',
34 created_at TEXT NOT NULL,
35 issue_seq INTEGER NOT NULL DEFAULT 0,
36 patch_seq INTEGER NOT NULL DEFAULT 0,
37 issue_template TEXT,
38 patch_template TEXT
39);
40
41CREATE TABLE IF NOT EXISTS issues (
42 id INTEGER PRIMARY KEY AUTOINCREMENT,
43 repo_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE,
44 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
45 number INTEGER NOT NULL,
46 title TEXT NOT NULL,
47 body TEXT NOT NULL DEFAULT '',
48 status TEXT NOT NULL DEFAULT 'open',
49 created_at TEXT NOT NULL,
50 updated_at TEXT NOT NULL,
51 edited_at TEXT,
52 UNIQUE(repo_id, number)
53);
54
55CREATE TABLE IF NOT EXISTS issue_comments (
56 id INTEGER PRIMARY KEY AUTOINCREMENT,
57 issue_id INTEGER NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
58 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
59 body TEXT NOT NULL,
60 created_at TEXT NOT NULL,
61 edited_at TEXT
62);
63
64CREATE TABLE IF NOT EXISTS issue_reactions (
65 id INTEGER PRIMARY KEY AUTOINCREMENT,
66 issue_id INTEGER NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
67 comment_id INTEGER REFERENCES issue_comments(id) ON DELETE CASCADE,
68 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
69 emoji TEXT NOT NULL,
70 UNIQUE(issue_id, comment_id, user_id)
71);
72
73CREATE TABLE IF NOT EXISTS patches (
74 id INTEGER PRIMARY KEY AUTOINCREMENT,
75 repo_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE,
76 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
77 number INTEGER NOT NULL,
78 title TEXT NOT NULL,
79 description TEXT NOT NULL DEFAULT '',
80 patch_content TEXT NOT NULL,
81 status TEXT NOT NULL DEFAULT 'open',
82 author_name TEXT NOT NULL DEFAULT '',
83 author_email TEXT NOT NULL DEFAULT '',
84 created_at TEXT NOT NULL,
85 updated_at TEXT NOT NULL,
86 edited_at TEXT,
87 UNIQUE(repo_id, number)
88);
89
90CREATE TABLE IF NOT EXISTS patch_comments (
91 id INTEGER PRIMARY KEY AUTOINCREMENT,
92 patch_id INTEGER NOT NULL REFERENCES patches(id) ON DELETE CASCADE,
93 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
94 body TEXT NOT NULL,
95 created_at TEXT NOT NULL,
96 edited_at TEXT
97);
98
99CREATE TABLE IF NOT EXISTS patch_reactions (
100 id INTEGER PRIMARY KEY AUTOINCREMENT,
101 patch_id INTEGER NOT NULL REFERENCES patches(id) ON DELETE CASCADE,
102 comment_id INTEGER REFERENCES patch_comments(id) ON DELETE CASCADE,
103 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
104 emoji TEXT NOT NULL,
105 UNIQUE(patch_id, comment_id, user_id)
106);
107
108CREATE TABLE IF NOT EXISTS ssh_keys (
109 id INTEGER PRIMARY KEY AUTOINCREMENT,
110 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
111 name TEXT NOT NULL,
112 public_key TEXT NOT NULL,
113 fingerprint TEXT NOT NULL UNIQUE,
114 created_at TEXT NOT NULL
115);
116
117CREATE TABLE IF NOT EXISTS releases (
118 id INTEGER PRIMARY KEY AUTOINCREMENT,
119 repo_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE,
120 tag_name TEXT,
121 name TEXT NOT NULL,
122 notes TEXT,
123 include_source_code INTEGER NOT NULL DEFAULT 0,
124 created_at TEXT NOT NULL,
125 UNIQUE(repo_id, tag_name)
126);
127
128CREATE TABLE IF NOT EXISTS release_assets (
129 id INTEGER PRIMARY KEY AUTOINCREMENT,
130 release_id INTEGER NOT NULL REFERENCES releases(id) ON DELETE CASCADE,
131 filename TEXT NOT NULL,
132 size INTEGER NOT NULL,
133 content_type TEXT NOT NULL,
134 created_at TEXT NOT NULL
135);
136