2026-02-14 20:59:03 -08:00
|
|
|
DO $$ BEGIN
|
2026-02-15 18:01:52 -08:00
|
|
|
CREATE TYPE constraint_kind AS ENUM ('must', 'prefer', 'prefer_not', 'must_not');
|
2026-02-14 20:59:03 -08:00
|
|
|
EXCEPTION WHEN duplicate_object THEN NULL;
|
|
|
|
|
END $$;
|
|
|
|
|
|
|
|
|
|
DO $$ BEGIN
|
|
|
|
|
CREATE TYPE constraint_level AS ENUM ('student', 'parent', 'admin');
|
|
|
|
|
EXCEPTION WHEN duplicate_object THEN NULL;
|
|
|
|
|
END $$;
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS trips (
|
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
|
name TEXT NOT NULL
|
|
|
|
|
);
|
|
|
|
|
|
2026-02-15 18:01:52 -08:00
|
|
|
ALTER TABLE trips ADD COLUMN IF NOT EXISTS room_size INTEGER NOT NULL DEFAULT 2;
|
|
|
|
|
|
2026-02-14 20:59:03 -08:00
|
|
|
CREATE TABLE IF NOT EXISTS trip_admins (
|
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
|
trip_id BIGINT NOT NULL REFERENCES trips(id) ON DELETE CASCADE,
|
|
|
|
|
email TEXT NOT NULL,
|
|
|
|
|
UNIQUE(trip_id, email)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS students (
|
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
|
trip_id BIGINT NOT NULL REFERENCES trips(id) ON DELETE CASCADE,
|
|
|
|
|
name TEXT NOT NULL,
|
|
|
|
|
email TEXT NOT NULL,
|
|
|
|
|
UNIQUE(trip_id, email)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS parents (
|
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
|
student_id BIGINT NOT NULL REFERENCES students(id) ON DELETE CASCADE,
|
|
|
|
|
email TEXT NOT NULL,
|
|
|
|
|
UNIQUE(student_id, email)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS roommate_constraints (
|
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
|
student_a_id BIGINT NOT NULL REFERENCES students(id) ON DELETE CASCADE,
|
|
|
|
|
student_b_id BIGINT NOT NULL REFERENCES students(id) ON DELETE CASCADE,
|
|
|
|
|
kind constraint_kind NOT NULL,
|
|
|
|
|
level constraint_level NOT NULL,
|
2026-02-15 18:01:52 -08:00
|
|
|
CHECK(student_a_id < student_b_id),
|
2026-02-14 20:59:03 -08:00
|
|
|
UNIQUE(student_a_id, student_b_id, level)
|
|
|
|
|
);
|