@@ -2,39 +2,61 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
22
33CREATE TABLE users (
44 id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
5- email VARCHAR UNIQUE NOT NULL ,
65 created_at TIMESTAMPTZ DEFAULT now()
76);
87
98CREATE TABLE courses (
109 id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
11- title VARCHAR NOT NULL ,
10+ name VARCHAR NOT NULL ,
1211 description TEXT ,
1312 created_at TIMESTAMPTZ DEFAULT now()
1413);
1514
1615CREATE TABLE categories (
17- id SERIAL PRIMARY KEY ,
1816 course_id UUID NOT NULL REFERENCES courses(id) ON DELETE CASCADE ,
1917 name VARCHAR NOT NULL ,
20- number INTEGER
18+ number INTEGER NOT NULL ,
19+ PRIMARY KEY (course_id, name)
2120);
2221
2322CREATE TABLE tasks (
24- id SERIAL PRIMARY KEY ,
25- category_id INTEGER NOT NULL REFERENCES categories(id) ON DELETE CASCADE ,
26- title VARCHAR NOT NULL ,
23+ id VARCHAR NOT NULL ,
24+ course_id UUID NOT NULL ,
25+ category_name VARCHAR NOT NULL ,
26+ name VARCHAR NOT NULL ,
2727 description TEXT ,
2828 points INTEGER DEFAULT 1 ,
29- created_at TIMESTAMPTZ DEFAULT now()
29+ created_at TIMESTAMPTZ DEFAULT now(),
30+ PRIMARY KEY (course_id, category_name, id),
31+ FOREIGN KEY (course_id, category_name) REFERENCES categories(course_id, name) ON DELETE CASCADE
32+ );
33+
34+ CREATE TABLE task_stages (
35+ id VARCHAR NOT NULL , -- stage ID (e.g., "task001A")
36+ course_id UUID NOT NULL ,
37+ category_name VARCHAR NOT NULL ,
38+ task_id VARCHAR NOT NULL , -- parent task ID
39+ name VARCHAR NOT NULL ,
40+ description TEXT ,
41+ weight INTEGER DEFAULT 1 ,
42+ flag JSONB, -- metadata like { kind: "user_derived" }
43+ created_at TIMESTAMPTZ DEFAULT now(),
44+ PRIMARY KEY (course_id, category_name, task_id, id),
45+ FOREIGN KEY (course_id, category_name, task_id) REFERENCES tasks(course_id, category_name, id) ON DELETE CASCADE
3046);
3147
3248
33- CREATE TABLE user_task_progress (
34- id SERIAL PRIMARY KEY ,
49+ CREATE TABLE user_stage_progress (
3550 user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE ,
36- task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE ,
51+ course_id UUID NOT NULL ,
52+ category_name VARCHAR NOT NULL ,
53+ task_id VARCHAR NOT NULL ,
54+ stage_id VARCHAR NOT NULL , -- stage ID
3755 completed_at TIMESTAMPTZ ,
56+ completed BOOLEAN NOT NULL DEFAULT FALSE,
3857 score INTEGER ,
39- UNIQUE (user_id, task_id)
58+ PRIMARY KEY (user_id, course_id, category_name, task_id, stage_id),
59+ FOREIGN KEY (course_id, category_name, task_id, stage_id)
60+ REFERENCES task_stages(course_id, category_name, task_id, id)
61+ ON DELETE CASCADE
4062);
0 commit comments