diff --git a/main.go b/main.go index ee97fe1..e46eee6 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "database/sql" + _ "embed" "fmt" "log" "net/http" @@ -10,6 +11,9 @@ import ( _ "github.com/lib/pq" ) +//go:embed schema.sql +var schema string + func main() { dsn := os.Getenv("PGCONN") if dsn == "" { @@ -27,6 +31,10 @@ func main() { } log.Println("connected to database") + if _, err := db.Exec(schema); err != nil { + log.Fatalf("failed to apply schema: %v", err) + } + http.Handle("/", http.FileServer(http.Dir("static"))) http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { diff --git a/schema.sql b/schema.sql new file mode 100644 index 0000000..dd6d95c --- /dev/null +++ b/schema.sql @@ -0,0 +1,45 @@ +DO $$ BEGIN + CREATE TYPE constraint_kind AS ENUM ('happy', 'ok', 'never'); +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 +); + +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, + UNIQUE(student_a_id, student_b_id, level) +);