summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--courses.go54
-rw-r--r--sql/drop.sql2
-rw-r--r--sql/schema.sql10
-rw-r--r--sql/tcourse.sql9
4 files changed, 45 insertions, 30 deletions
diff --git a/courses.go b/courses.go
index 29141b8..312fb33 100644
--- a/courses.go
+++ b/courses.go
@@ -22,11 +22,15 @@ package main
import (
"context"
+ "errors"
"fmt"
"sync"
)
-type coursetypeT string
+type (
+ courseTypeT string
+ courseGroupT string
+)
type courseT struct {
ID int
@@ -34,18 +38,41 @@ type courseT struct {
SelectedLock sync.RWMutex
Max int
Title string
- Type coursetypeT
+ Type courseTypeT
+ Group courseGroupT
Teacher string
Location string
}
-/*
- * const (
- * sport coursetypeT = "Sport"
- * enrichment coursetypeT = "Enrichment"
- * culture coursetypeT = "Culture"
- * )
- */
+const (
+ sport courseTypeT = "Sport"
+ enrichment courseTypeT = "Enrichment"
+ culture courseTypeT = "Culture"
+)
+
+const (
+ mw1 courseGroupT = "MW1"
+ mw2 courseGroupT = "MW2"
+ mw3 courseGroupT = "MW3"
+ tt1 courseGroupT = "TT1"
+ tt2 courseGroupT = "TT2"
+ tt3 courseGroupT = "TT3"
+)
+
+/* TODO: This may be inefficient, perhaps use a hash table */
+
+func checkCourseType(ct courseTypeT) bool {
+ return ct == sport || ct == enrichment || ct == culture
+}
+
+func checkCourseGroup(cg courseGroupT) bool {
+ return cg == mw1 || cg == mw2 || cg == mw3 || cg == tt1 || cg == tt2 || cg == tt3
+}
+
+var (
+ errInvalidCourseType = errors.New("invalid course type")
+ errInvalidCourseGroup = errors.New("invalid course group")
+)
/*
* The courses are simply stored in a map indexed by the course ID, although
@@ -79,7 +106,7 @@ func setupCourses() error {
rows, err := db.Query(
context.Background(),
- "SELECT id, nmax, title, ctype, teacher, location FROM courses",
+ "SELECT id, nmax, title, ctype, cgroup, teacher, location FROM courses",
)
if err != nil {
return fmt.Errorf("error fetching courses: %w", err)
@@ -99,12 +126,19 @@ func setupCourses() error {
&currentCourse.Max,
&currentCourse.Title,
&currentCourse.Type,
+ &currentCourse.Group,
&currentCourse.Teacher,
&currentCourse.Location,
)
if err != nil {
return fmt.Errorf("error fetching courses: %w", err)
}
+ if !checkCourseType(currentCourse.Type) {
+ return fmt.Errorf("%w: %d %s", errInvalidCourseType, currentCourse.ID, currentCourse.Type)
+ }
+ if !checkCourseGroup(currentCourse.Group) {
+ return fmt.Errorf("%w: %d %s", errInvalidCourseGroup, currentCourse.ID, currentCourse.Group)
+ }
err := db.QueryRow(context.Background(),
"SELECT COUNT (*) FROM choices WHERE courseid = $1",
currentCourse.ID,
diff --git a/sql/drop.sql b/sql/drop.sql
index cc21040..549db26 100644
--- a/sql/drop.sql
+++ b/sql/drop.sql
@@ -1,5 +1,3 @@
DROP TABLE choices;
DROP TABLE users;
DROP TABLE courses;
-DROP TABLE ctypes;
-DROP TABLE cgroups;
diff --git a/sql/schema.sql b/sql/schema.sql
index ecf31a2..3248f14 100644
--- a/sql/schema.sql
+++ b/sql/schema.sql
@@ -1,9 +1,3 @@
-CREATE TABLE ctypes (
- name TEXT PRIMARY KEY NOT NULL
-);
-CREATE TABLE cgroups (
- name TEXT PRIMARY KEY NOT NULL
-);
CREATE TABLE courses (
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
nmax INTEGER NOT NULL,
@@ -11,9 +5,7 @@ CREATE TABLE courses (
teacher TEXT NOT NULL,
location TEXT NOT NULL,
ctype TEXT NOT NULL,
- FOREIGN KEY(ctype) REFERENCES ctypes(name),
- cgroup TEXT NOT NULL,
- FOREIGN KEY(cgroup) REFERENCES cgroups(name)
+ cgroup TEXT NOT NULL
);
CREATE TABLE users (
id TEXT PRIMARY KEY NOT NULL, -- should be UUID
diff --git a/sql/tcourse.sql b/sql/tcourse.sql
index 171a30c..64c315e 100644
--- a/sql/tcourse.sql
+++ b/sql/tcourse.sql
@@ -1,12 +1,3 @@
-INSERT INTO ctypes (name) VALUES('Enrichment');
-INSERT INTO ctypes (name) VALUES('Sport');
-INSERT INTO ctypes (name) VALUES('Culture');
-INSERT INTO cgroups (name) VALUES('MW1');
-INSERT INTO cgroups (name) VALUES('MW2');
-INSERT INTO cgroups (name) VALUES('MW3');
-INSERT INTO cgroups (name) VALUES('TT1');
-INSERT INTO cgroups (name) VALUES('TT2');
-INSERT INTO cgroups (name) VALUES('TT3');
INSERT INTO courses (title, ctype, cgroup, teacher, location, nmax) VALUES('Floorball', 'Sport', 'MW1', 'Chen Xiaojia', 'Gym', 1000);
INSERT INTO courses (title, ctype, cgroup, teacher, location, nmax) VALUES('Flag Football', 'Sport', 'MW2', 'Ding Zhaoyuan', 'Pitch', 1000);
INSERT INTO courses (title, ctype, cgroup, teacher, location, nmax) VALUES('Chamber Music', 'Enrichment', 'TT1', '(?)', 'Music Rooms', 1000);