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 is_pending INTEGER NOT NULL DEFAULT 0,
10 register_application TEXT
11);
12
13CREATE TABLE IF NOT EXISTS passkeys (
14 id INTEGER PRIMARY KEY AUTOINCREMENT,
15 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
16 credential_id TEXT UNIQUE NOT NULL,
17 public_key TEXT NOT NULL,
18 counter INTEGER NOT NULL DEFAULT 0,
19 created_at TEXT NOT NULL
20);
21
22CREATE TABLE IF NOT EXISTS sessions (
23 id TEXT PRIMARY KEY,
24 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
25 expires_at TEXT NOT NULL,
26 created_at TEXT NOT NULL
27);
28
29CREATE TABLE IF NOT EXISTS repositories (
30 id INTEGER PRIMARY KEY AUTOINCREMENT,
31 name TEXT UNIQUE NOT NULL,
32 description TEXT,
33 is_private INTEGER NOT NULL DEFAULT 0,
34 is_pinned INTEGER NOT NULL DEFAULT 0,
35 default_branch TEXT NOT NULL DEFAULT 'main',
36 created_at TEXT NOT NULL,
37 issue_seq INTEGER NOT NULL DEFAULT 0,
38 patch_seq INTEGER NOT NULL DEFAULT 0,
39 issue_template TEXT,
40 patch_template TEXT
41);
42
43CREATE TABLE IF NOT EXISTS issues (
44 id INTEGER PRIMARY KEY AUTOINCREMENT,
45 repo_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE,
46 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
47 number INTEGER NOT NULL,
48 title TEXT NOT NULL,
49 body TEXT NOT NULL DEFAULT '',
50 status TEXT NOT NULL DEFAULT 'open',
51 created_at TEXT NOT NULL,
52 updated_at TEXT NOT NULL,
53 edited_at TEXT,
54 UNIQUE(repo_id, number)
55);
56
57CREATE TABLE IF NOT EXISTS issue_comments (
58 id INTEGER PRIMARY KEY AUTOINCREMENT,
59 issue_id INTEGER NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
60 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
61 body TEXT NOT NULL,
62 created_at TEXT NOT NULL,
63 edited_at TEXT
64);
65
66CREATE TABLE IF NOT EXISTS issue_reactions (
67 id INTEGER PRIMARY KEY AUTOINCREMENT,
68 issue_id INTEGER NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
69 comment_id INTEGER REFERENCES issue_comments(id) ON DELETE CASCADE,
70 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
71 emoji TEXT NOT NULL,
72 UNIQUE(issue_id, comment_id, user_id)
73);
74
75CREATE TABLE IF NOT EXISTS patches (
76 id INTEGER PRIMARY KEY AUTOINCREMENT,
77 repo_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE,
78 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
79 number INTEGER NOT NULL,
80 title TEXT NOT NULL,
81 description TEXT NOT NULL DEFAULT '',
82 patch_content TEXT NOT NULL,
83 status TEXT NOT NULL DEFAULT 'open',
84 author_name TEXT NOT NULL DEFAULT '',
85 author_email TEXT NOT NULL DEFAULT '',
86 created_at TEXT NOT NULL,
87 updated_at TEXT NOT NULL,
88 edited_at TEXT,
89 version TEXT NOT NULL DEFAULT '',
90 UNIQUE(repo_id, number)
91);
92
93CREATE TABLE IF NOT EXISTS patch_comments (
94 id INTEGER PRIMARY KEY AUTOINCREMENT,
95 patch_id INTEGER NOT NULL REFERENCES patches(id) ON DELETE CASCADE,
96 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
97 body TEXT NOT NULL,
98 created_at TEXT NOT NULL,
99 edited_at TEXT
100);
101
102CREATE TABLE IF NOT EXISTS patch_reactions (
103 id INTEGER PRIMARY KEY AUTOINCREMENT,
104 patch_id INTEGER NOT NULL REFERENCES patches(id) ON DELETE CASCADE,
105 comment_id INTEGER REFERENCES patch_comments(id) ON DELETE CASCADE,
106 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
107 emoji TEXT NOT NULL,
108 UNIQUE(patch_id, comment_id, user_id)
109);
110
111CREATE TABLE IF NOT EXISTS ssh_keys (
112 id INTEGER PRIMARY KEY AUTOINCREMENT,
113 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
114 name TEXT NOT NULL,
115 public_key TEXT NOT NULL,
116 fingerprint TEXT NOT NULL UNIQUE,
117 created_at TEXT NOT NULL
118);
119
120CREATE TABLE IF NOT EXISTS releases (
121 id INTEGER PRIMARY KEY AUTOINCREMENT,
122 repo_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE,
123 tag_name TEXT,
124 name TEXT NOT NULL,
125 notes TEXT,
126 include_source_code INTEGER NOT NULL DEFAULT 0,
127 created_at TEXT NOT NULL,
128 UNIQUE(repo_id, tag_name)
129);
130
131CREATE TABLE IF NOT EXISTS release_assets (
132 id INTEGER PRIMARY KEY AUTOINCREMENT,
133 release_id INTEGER NOT NULL REFERENCES releases(id) ON DELETE CASCADE,
134 filename TEXT NOT NULL,
135 size INTEGER NOT NULL,
136 content_type TEXT NOT NULL,
137 created_at TEXT NOT NULL
138);
139
140CREATE TABLE IF NOT EXISTS labels (
141 id INTEGER PRIMARY KEY AUTOINCREMENT,
142 repo_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE,
143 name TEXT NOT NULL,
144 color TEXT NOT NULL DEFAULT '#808080',
145 created_at TEXT NOT NULL,
146 UNIQUE(repo_id, name)
147);
148
149CREATE TABLE IF NOT EXISTS issue_labels (
150 issue_id INTEGER NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
151 label_id INTEGER NOT NULL REFERENCES labels(id) ON DELETE CASCADE,
152 PRIMARY KEY (issue_id, label_id)
153);
154
155CREATE TABLE IF NOT EXISTS patch_labels (
156 patch_id INTEGER NOT NULL REFERENCES patches(id) ON DELETE CASCADE,
157 label_id INTEGER NOT NULL REFERENCES labels(id) ON DELETE CASCADE,
158 PRIMARY KEY (patch_id, label_id)
159);
160