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 default_branch TEXT NOT NULL DEFAULT 'main',
33 created_at TEXT NOT NULL,
34 issue_seq INTEGER NOT NULL DEFAULT 0,
35 patch_seq INTEGER NOT NULL DEFAULT 0
36);
37
38CREATE TABLE IF NOT EXISTS issues (
39 id INTEGER PRIMARY KEY AUTOINCREMENT,
40 repo_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE,
41 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
42 number INTEGER NOT NULL,
43 title TEXT NOT NULL,
44 body TEXT NOT NULL DEFAULT '',
45 status TEXT NOT NULL DEFAULT 'open',
46 created_at TEXT NOT NULL,
47 updated_at TEXT NOT NULL,
48 edited_at TEXT,
49 UNIQUE(repo_id, number)
50);
51
52CREATE TABLE IF NOT EXISTS issue_comments (
53 id INTEGER PRIMARY KEY AUTOINCREMENT,
54 issue_id INTEGER NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
55 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
56 body TEXT NOT NULL,
57 created_at TEXT NOT NULL,
58 edited_at TEXT
59);
60
61CREATE TABLE IF NOT EXISTS issue_reactions (
62 id INTEGER PRIMARY KEY AUTOINCREMENT,
63 issue_id INTEGER NOT NULL REFERENCES issues(id) ON DELETE CASCADE,
64 comment_id INTEGER REFERENCES issue_comments(id) ON DELETE CASCADE,
65 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
66 emoji TEXT NOT NULL,
67 UNIQUE(issue_id, comment_id, user_id)
68);
69
70CREATE TABLE IF NOT EXISTS patches (
71 id INTEGER PRIMARY KEY AUTOINCREMENT,
72 repo_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE,
73 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
74 number INTEGER NOT NULL,
75 title TEXT NOT NULL,
76 description TEXT NOT NULL DEFAULT '',
77 patch_content TEXT NOT NULL,
78 status TEXT NOT NULL DEFAULT 'open',
79 author_name TEXT NOT NULL DEFAULT '',
80 author_email TEXT NOT NULL DEFAULT '',
81 created_at TEXT NOT NULL,
82 updated_at TEXT NOT NULL,
83 edited_at TEXT,
84 UNIQUE(repo_id, number)
85);
86
87CREATE TABLE IF NOT EXISTS patch_comments (
88 id INTEGER PRIMARY KEY AUTOINCREMENT,
89 patch_id INTEGER NOT NULL REFERENCES patches(id) ON DELETE CASCADE,
90 author_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
91 body TEXT NOT NULL,
92 created_at TEXT NOT NULL,
93 edited_at TEXT
94);
95
96CREATE TABLE IF NOT EXISTS patch_reactions (
97 id INTEGER PRIMARY KEY AUTOINCREMENT,
98 patch_id INTEGER NOT NULL REFERENCES patches(id) ON DELETE CASCADE,
99 comment_id INTEGER REFERENCES patch_comments(id) ON DELETE CASCADE,
100 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
101 emoji TEXT NOT NULL,
102 UNIQUE(patch_id, comment_id, user_id)
103);
104
105CREATE TABLE IF NOT EXISTS ssh_keys (
106 id INTEGER PRIMARY KEY AUTOINCREMENT,
107 user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
108 name TEXT NOT NULL,
109 public_key TEXT NOT NULL,
110 fingerprint TEXT NOT NULL UNIQUE,
111 created_at TEXT NOT NULL
112);
113
114CREATE TABLE IF NOT EXISTS releases (
115 id INTEGER PRIMARY KEY AUTOINCREMENT,
116 repo_id INTEGER NOT NULL REFERENCES repositories(id) ON DELETE CASCADE,
117 tag_name TEXT,
118 name TEXT NOT NULL,
119 notes TEXT,
120 include_source_code INTEGER NOT NULL DEFAULT 0,
121 created_at TEXT NOT NULL,
122 UNIQUE(repo_id, tag_name)
123);
124
125CREATE TABLE IF NOT EXISTS release_assets (
126 id INTEGER PRIMARY KEY AUTOINCREMENT,
127 release_id INTEGER NOT NULL REFERENCES releases(id) ON DELETE CASCADE,
128 filename TEXT NOT NULL,
129 size INTEGER NOT NULL,
130 content_type TEXT NOT NULL,
131 created_at TEXT NOT NULL
132);
133