diff options
-rw-r--r-- | courses.go | 54 | ||||
-rw-r--r-- | sql/drop.sql | 2 | ||||
-rw-r--r-- | sql/schema.sql | 10 | ||||
-rw-r--r-- | sql/tcourse.sql | 9 |
4 files changed, 45 insertions, 30 deletions
@@ -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 { ¤tCourse.Max, ¤tCourse.Title, ¤tCourse.Type, + ¤tCourse.Group, ¤tCourse.Teacher, ¤tCourse.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); |