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 NOT NULL,
118 name TEXT,
119 notes TEXT,
120 commit_hash TEXT NOT NULL,
121 include_source_code INTEGER NOT NULL DEFAULT 0,
122 created_at TEXT NOT NULL,
123 UNIQUE(repo_id, tag_name)
124);
125
126CREATE TABLE IF NOT EXISTS release_assets (
127 id INTEGER PRIMARY KEY AUTOINCREMENT,
128 release_id INTEGER NOT NULL REFERENCES releases(id) ON DELETE CASCADE,
129 filename TEXT NOT NULL,
130 size INTEGER NOT NULL,
131 content_type TEXT NOT NULL,
132 created_at TEXT NOT NULL
133);
134