Files
teaching-feedback-assistant/migrations/0001_initial_schema.sql
shay7sev f1e5fd8793 feat: establish Rust teaching feedback API
Add the Axum and PostgreSQL service for profiles, defaults, and feedback records, including migrations, OpenAPI documentation, and development identity handling for version 0.1.0.
2026-07-15 15:36:51 +08:00

46 lines
1.8 KiB
SQL

CREATE TABLE student_profiles (
id UUID PRIMARY KEY,
owner_id UUID NOT NULL,
name VARCHAR(20) NOT NULL CHECK (char_length(btrim(name)) BETWEEN 1 AND 20),
grade VARCHAR(40) NOT NULL CHECK (char_length(btrim(grade)) > 0),
subject VARCHAR(40) NOT NULL CHECK (char_length(btrim(subject)) > 0),
academic_year SMALLINT NOT NULL CHECK (academic_year BETWEEN 2000 AND 2200),
term VARCHAR(1) NOT NULL CHECK (term IN ('', '', '', '')),
guardian_title VARCHAR(24) NOT NULL CHECK (char_length(btrim(guardian_title)) BETWEEN 1 AND 24),
start_time CHAR(5) NOT NULL,
end_time CHAR(5) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX student_profiles_owner_updated_idx
ON student_profiles (owner_id, updated_at DESC);
CREATE INDEX student_profiles_owner_grade_subject_idx
ON student_profiles (owner_id, grade, subject);
CREATE TABLE student_profile_defaults (
owner_id UUID PRIMARY KEY,
grade VARCHAR(40) NOT NULL CHECK (char_length(btrim(grade)) > 0),
subject VARCHAR(40) NOT NULL CHECK (char_length(btrim(subject)) > 0),
lesson_duration_minutes SMALLINT NOT NULL
CHECK (lesson_duration_minutes BETWEEN 15 AND 360 AND lesson_duration_minutes % 15 = 0),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE feedback_records (
id UUID PRIMARY KEY,
owner_id UUID NOT NULL,
profile_id UUID REFERENCES student_profiles(id) ON DELETE SET NULL,
feedback_date DATE NOT NULL,
content TEXT NOT NULL CHECK (char_length(btrim(content)) > 0),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX feedback_records_owner_date_idx
ON feedback_records (owner_id, feedback_date DESC, updated_at DESC);
CREATE INDEX feedback_records_owner_profile_idx
ON feedback_records (owner_id, profile_id);