-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathschema.sql
More file actions
280 lines (277 loc) · 9.57 KB
/
Copy pathschema.sql
File metadata and controls
280 lines (277 loc) · 9.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
CREATE TABLE users (
id TEXT PRIMARY KEY,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
is_sysadmin BOOLEAN DEFAULT 0 CHECK(is_sysadmin IN (0, 1)),
avatar_url TEXT DEFAULT '/default-avatar.svg',
theme_preference TEXT DEFAULT 'orion_neon',
last_workspace_id TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sessions (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
expires_at INTEGER NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE workspaces (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
sys_tag TEXT NOT NULL UNIQUE,
icon TEXT,
description TEXT,
created_by TEXT NOT NULL,
is_public BOOLEAN DEFAULT 0 CHECK(is_public IN (0, 1)),
join_policy TEXT DEFAULT 'disabled' CHECK(join_policy IN ('open', 'friends_only', 'disabled')),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (created_by) REFERENCES users(id)
);
CREATE TABLE workspace_members (
workspace_id TEXT NOT NULL,
user_id TEXT NOT NULL,
ws_role TEXT NOT NULL CHECK(ws_role IN ('owner', 'editor', 'commenter', 'viewer')),
joined_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (workspace_id, user_id),
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE INDEX idx_ws_members_user ON workspace_members(user_id);
CREATE TABLE sprints (
id TEXT PRIMARY KEY,
workspace_id TEXT NOT NULL,
name TEXT NOT NULL,
start_date DATETIME,
end_date DATETIME,
status TEXT CHECK(status IN ('planned', 'active', 'completed')) DEFAULT 'planned', goal TEXT,
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
);
CREATE TABLE issues (
id TEXT PRIMARY KEY,
workspace_id TEXT NOT NULL,
sprint_id TEXT,
parent_issue_id TEXT,
type TEXT NOT NULL CHECK(type IN ('epic', 'story', 'task', 'bug')),
title TEXT NOT NULL,
description TEXT,
status TEXT DEFAULT 'todo',
priority TEXT CHECK(priority IN ('lowest', 'low', 'medium', 'high', 'highest')) DEFAULT 'medium',
story_points INTEGER DEFAULT 0,
estimated_hours REAL DEFAULT 0.0,
logged_hours REAL DEFAULT 0.0,
position REAL DEFAULT 0.0,
reporter_id TEXT NOT NULL,
assignee_id TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, due_date DATETIME,
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
FOREIGN KEY (sprint_id) REFERENCES sprints(id) ON DELETE SET NULL,
FOREIGN KEY (parent_issue_id) REFERENCES issues(id) ON DELETE CASCADE,
FOREIGN KEY (reporter_id) REFERENCES users(id),
FOREIGN KEY (assignee_id) REFERENCES users(id)
);
CREATE INDEX idx_issues_workspace ON issues(workspace_id);
CREATE TABLE work_logs (
id TEXT PRIMARY KEY,
issue_id TEXT NOT NULL,
user_id TEXT NOT NULL,
hours_spent REAL NOT NULL,
description TEXT,
logged_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE pages (
id TEXT PRIMARY KEY,
workspace_id TEXT NOT NULL,
parent_page_id TEXT,
title TEXT NOT NULL DEFAULT 'Untitled',
icon TEXT,
cover_image TEXT,
content_json TEXT, -- Payload de Editor.js o Excalidraw
created_by TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
FOREIGN KEY (parent_page_id) REFERENCES pages(id) ON DELETE CASCADE,
FOREIGN KEY (created_by) REFERENCES users(id)
);
CREATE TABLE document_chunks (
id TEXT PRIMARY KEY,
entity_id TEXT NOT NULL,
workspace_id TEXT NOT NULL,
chunk_text TEXT NOT NULL,
embedding_vector BLOB, -- Serialized Float32Array para búsqueda vectorial LLM
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
);
CREATE TABLE dynamic_databases (
id TEXT PRIMARY KEY,
workspace_id TEXT NOT NULL,
name TEXT NOT NULL,
schema_json TEXT NOT NULL,
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
);
CREATE TABLE dynamic_entries (
id TEXT PRIMARY KEY,
database_id TEXT NOT NULL,
payload_json TEXT NOT NULL,
created_by TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (database_id) REFERENCES dynamic_databases(id) ON DELETE CASCADE,
FOREIGN KEY (created_by) REFERENCES users(id)
);
CREATE TABLE entry_relations (
source_entry_id TEXT NOT NULL,
target_entry_id TEXT NOT NULL,
PRIMARY KEY (source_entry_id, target_entry_id),
FOREIGN KEY (source_entry_id) REFERENCES dynamic_entries(id) ON DELETE CASCADE,
FOREIGN KEY (target_entry_id) REFERENCES dynamic_entries(id) ON DELETE CASCADE
);
CREATE TABLE public_forms (
id TEXT PRIMARY KEY,
dynamic_database_id TEXT NOT NULL,
title TEXT NOT NULL,
description TEXT,
is_active BOOLEAN DEFAULT 1 CHECK(is_active IN (0, 1)),
FOREIGN KEY (dynamic_database_id) REFERENCES dynamic_databases(id) ON DELETE CASCADE
);
CREATE TABLE channels (
id TEXT PRIMARY KEY,
workspace_id TEXT NOT NULL,
name TEXT NOT NULL,
type TEXT DEFAULT 'public' CHECK(type IN ('public', 'private')),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
);
CREATE TABLE messages (
id TEXT PRIMARY KEY,
channel_id TEXT NOT NULL,
user_id TEXT NOT NULL,
content TEXT NOT NULL,
is_edited BOOLEAN DEFAULT 0 CHECK(is_edited IN (0, 1)),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE attachments (
id TEXT PRIMARY KEY,
entity_type TEXT NOT NULL CHECK(entity_type IN ('issue', 'page', 'dynamic_entry', 'message')),
entity_id TEXT NOT NULL,
file_name TEXT NOT NULL,
file_path TEXT NOT NULL,
mime_type TEXT NOT NULL,
size_bytes INTEGER NOT NULL,
uploaded_by TEXT NOT NULL,
uploaded_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (uploaded_by) REFERENCES users(id)
);
CREATE TABLE automations (
id TEXT PRIMARY KEY,
workspace_id TEXT NOT NULL,
name TEXT NOT NULL,
trigger_type TEXT NOT NULL,
trigger_condition TEXT NOT NULL, -- JSON config
action_type TEXT NOT NULL,
action_payload TEXT NOT NULL, -- JSON config
is_active BOOLEAN DEFAULT 1 CHECK(is_active IN (0, 1)),
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
);
CREATE TABLE audit_logs (
id TEXT PRIMARY KEY,
user_id TEXT,
action TEXT NOT NULL,
entity_type TEXT NOT NULL,
entity_id TEXT NOT NULL,
details_json TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
);
CREATE TABLE notifications (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
title TEXT NOT NULL,
message TEXT NOT NULL,
is_read BOOLEAN DEFAULT 0 CHECK(is_read IN (0, 1)),
link_url TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, type TEXT DEFAULT 'info',
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE labels (
id TEXT PRIMARY KEY,
workspace_id TEXT NOT NULL,
name TEXT NOT NULL,
color TEXT NOT NULL DEFAULT '#00E5FF',
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
);
CREATE INDEX idx_labels_workspace ON labels(workspace_id);
CREATE TABLE issue_labels (
issue_id TEXT NOT NULL,
label_id TEXT NOT NULL,
PRIMARY KEY (issue_id, label_id),
FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE,
FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE
);
CREATE TABLE page_labels (
page_id TEXT NOT NULL,
label_id TEXT NOT NULL,
PRIMARY KEY (page_id, label_id),
FOREIGN KEY (page_id) REFERENCES pages(id) ON DELETE CASCADE,
FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE
);
CREATE TABLE issue_page_links (
issue_id TEXT NOT NULL,
page_id TEXT NOT NULL,
linked_by TEXT NOT NULL,
linked_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (issue_id, page_id),
FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE,
FOREIGN KEY (page_id) REFERENCES pages(id) ON DELETE CASCADE,
FOREIGN KEY (linked_by) REFERENCES users(id)
);
CREATE TABLE milestones (
id TEXT PRIMARY KEY,
workspace_id TEXT NOT NULL,
name TEXT NOT NULL,
target_date DATETIME,
status TEXT CHECK(status IN ('planned', 'achieved', 'missed')) DEFAULT 'planned',
description TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
);
CREATE INDEX idx_milestones_workspace ON milestones(workspace_id);
CREATE TABLE time_tracking_sessions (
id TEXT PRIMARY KEY,
issue_id TEXT NOT NULL,
user_id TEXT NOT NULL,
started_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE friendships (
id TEXT PRIMARY KEY,
user_a_id TEXT NOT NULL,
user_b_id TEXT NOT NULL,
status TEXT NOT NULL CHECK (status IN ('pending','accepted','rejected','ended','blocked')),
action_user_id TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
CHECK (user_a_id < user_b_id),
CHECK (user_a_id != user_b_id),
UNIQUE (user_a_id, user_b_id)
);
CREATE TABLE user_blocks (
id TEXT PRIMARY KEY,
blocker_id TEXT NOT NULL,
blocked_id TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE (blocker_id, blocked_id),
CHECK (blocker_id != blocked_id)
);
CREATE TABLE workspace_join_requests (
id TEXT PRIMARY KEY,
workspace_id TEXT NOT NULL,
user_id TEXT NOT NULL,
status TEXT NOT NULL CHECK (status IN ('pending','approved','rejected','cancelled')),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE (workspace_id, user_id)
);