Files
tutortool/backend/migrations/001_initial.sql
s0wlz (Matthias Puchstein) 4aea0f4427 chore: clean up repo state and improve dev tooling
- Add IF NOT EXISTS to all migration DDL for idempotency
- Support PORT env var in backend (for compose flexibility)
- Support HOST_PORT env var in docker-compose
- Improve seed-demo to apply migrations before seeding
- Gitignore .claude/ session cache
2026-04-29 01:39:00 +02:00

80 lines
2.9 KiB
SQL

CREATE TABLE IF NOT EXISTS courses (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
semester TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS tutors (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS tutor_courses (
tutor_id INTEGER NOT NULL REFERENCES tutors(id),
course_id INTEGER NOT NULL REFERENCES courses(id),
PRIMARY KEY (tutor_id, course_id)
);
CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY,
course_id INTEGER NOT NULL REFERENCES courses(id),
name TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS rooms (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
layout_json TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS sessions (
id INTEGER PRIMARY KEY,
course_id INTEGER NOT NULL REFERENCES courses(id),
week_nr INTEGER NOT NULL,
date TEXT NOT NULL CHECK (date GLOB '????-??-??'),
UNIQUE(course_id, week_nr)
);
CREATE TABLE IF NOT EXISTS slots (
id INTEGER PRIMARY KEY,
session_id INTEGER NOT NULL REFERENCES sessions(id),
room_id INTEGER REFERENCES rooms(id),
tutor_id INTEGER NOT NULL REFERENCES tutors(id),
start_time TEXT NOT NULL CHECK (start_time GLOB '??:??'),
end_time TEXT NOT NULL CHECK (end_time GLOB '??:??'),
status TEXT NOT NULL DEFAULT 'closed' CHECK (status IN ('closed','open','locked')),
code TEXT UNIQUE
);
CREATE TABLE IF NOT EXISTS attendances (
id INTEGER PRIMARY KEY,
slot_id INTEGER NOT NULL REFERENCES slots(id),
student_id INTEGER NOT NULL REFERENCES students(id),
seat_id TEXT,
checked_in_at TEXT NOT NULL CHECK (checked_in_at GLOB '????-??-??T??:??:??*'),
UNIQUE(slot_id, student_id),
UNIQUE(slot_id, seat_id)
);
CREATE TABLE IF NOT EXISTS notes (
id INTEGER PRIMARY KEY,
slot_id INTEGER NOT NULL REFERENCES slots(id),
student_id INTEGER NOT NULL REFERENCES students(id),
tutor_id INTEGER NOT NULL REFERENCES tutors(id),
content TEXT NOT NULL DEFAULT '',
updated_at TEXT NOT NULL CHECK (updated_at GLOB '????-??-??T??:??:??*'),
UNIQUE(slot_id, student_id, tutor_id)
);
-- Indexes on high-frequency FK columns (SQLite does not auto-index FKs)
CREATE INDEX IF NOT EXISTS idx_students_course ON students(course_id);
CREATE INDEX IF NOT EXISTS idx_sessions_course ON sessions(course_id);
CREATE INDEX IF NOT EXISTS idx_slots_session ON slots(session_id);
CREATE INDEX IF NOT EXISTS idx_slots_tutor ON slots(tutor_id);
CREATE INDEX IF NOT EXISTS idx_attendances_slot ON attendances(slot_id);
CREATE INDEX IF NOT EXISTS idx_attendances_student ON attendances(student_id);
CREATE INDEX IF NOT EXISTS idx_notes_slot ON notes(slot_id);
CREATE INDEX IF NOT EXISTS idx_notes_student ON notes(student_id);