diff --git a/backend/main.go b/backend/main.go index 9d67b7d..caf1ce3 100644 --- a/backend/main.go +++ b/backend/main.go @@ -21,9 +21,7 @@ func main() { // (the isGoRun check is to enable it only during development) Automigrate: isGoRun, }) - service.AddRoutes(app) - service.AddSchedules(app) if err := app.Start(); err != nil { diff --git a/backend/service/addRoute.go b/backend/service/addRoute.go index a9fa997..6a2bd28 100644 --- a/backend/service/addRoute.go +++ b/backend/service/addRoute.go @@ -294,8 +294,14 @@ func AddRoutes(app *pocketbase.PocketBase) { Method: http.MethodGet, Path: "/api/courses", Handler: func(c echo.Context) error { - courses := events.GetAllCourses(app) - return c.JSON(200, courses) + semester := c.QueryParam("semester") + if semester == "" { + courses := events.GetAllCourses(app) + return c.JSON(200, courses) + } else { + courses := events.GetAllCoursesForSemester(app, semester) + return c.JSON(200, courses) + } }, Middlewares: []echo.MiddlewareFunc{ apis.ActivityLogger(app), @@ -307,14 +313,21 @@ func AddRoutes(app *pocketbase.PocketBase) { return nil }) + // api end point to get all courses for a specific semester with courses that have events app.OnBeforeServe().Add(func(e *core.ServeEvent) error { _, err := e.Router.AddRoute(echo.Route{ Method: http.MethodGet, - Path: "/api/courses", + Path: "/api/courses/events", Handler: func(c echo.Context) error { semester := c.QueryParam("semester") - courses := events.GetAllCoursesForSemester(app, semester) - return c.JSON(200, courses) + courses, err := events.GetAllCoursesForSemesterWithEvents(app, semester) + + if err != nil { + slog.Error("Failed to get courses for semester with events: %v", err) + return c.JSON(http.StatusBadRequest, "Failed to get courses for semester with events") + } else { + return c.JSON(200, courses) + } }, Middlewares: []echo.MiddlewareFunc{ apis.ActivityLogger(app), diff --git a/backend/service/db/dbGroups.go b/backend/service/db/dbGroups.go index 545b071..81af46b 100644 --- a/backend/service/db/dbGroups.go +++ b/backend/service/db/dbGroups.go @@ -82,13 +82,13 @@ func GetAllCourses(app *pocketbase.PocketBase) []string { return courseArray } -func GetAllCoursesForSemester(app *pocketbase.PocketBase, semester string) interface{} { +func GetAllCoursesForSemester(app *pocketbase.PocketBase, semester string) []string { var courses []struct { CourseShortcut string `db:"course" json:"course"` } - // get all rooms from event records in the events collection + // get all courses for a specific semester err := app.Dao().DB().Select("course").From("groups").Where(dbx.NewExp("semester = {:semester}", dbx.Params{"semester": semester})).All(&courses) if err != nil { slog.Error("Error while getting groups from database: ", err) @@ -104,3 +104,25 @@ func GetAllCoursesForSemester(app *pocketbase.PocketBase, semester string) inter return courseArray } + +func GetAllCoursesForSemesterWithEvents(app *pocketbase.PocketBase, semester string) ([]string, error) { + + var courses []struct { + CourseShortcut string `db:"course" json:"course"` + } + + // get all courses from events distinct for a specific semester + err := app.Dao().DB().Select("course").From("events").Where(dbx.NewExp("semester = {:semester}", dbx.Params{"semester": semester})).Distinct(true).All(&courses) + if err != nil { + slog.Error("Error while getting groups from database: ", err) + return nil, err + } + + var courseArray []string + + for _, course := range courses { + courseArray = append(courseArray, course.CourseShortcut) + } + + return courseArray, nil +} diff --git a/backend/service/events/courseService.go b/backend/service/events/courseService.go index 3f9e99c..c20134e 100644 --- a/backend/service/events/courseService.go +++ b/backend/service/events/courseService.go @@ -3,12 +3,35 @@ package events import ( "github.com/pocketbase/pocketbase" "htwkalender/service/db" + "htwkalender/service/functions" ) func GetAllCourses(app *pocketbase.PocketBase) []string { return db.GetAllCourses(app) } -func GetAllCoursesForSemester(app *pocketbase.PocketBase, semester string) interface{} { +func GetAllCoursesForSemester(app *pocketbase.PocketBase, semester string) []string { return db.GetAllCoursesForSemester(app, semester) } + +func GetAllCoursesForSemesterWithEvents(app *pocketbase.PocketBase, semester string) ([]string, error) { + courses, err := db.GetAllCoursesForSemesterWithEvents(app, semester) + if err != nil { + return nil, err + } else { + // remove empty courses + courses = removeEmptyCourses(courses) + return courses, nil + } +} + +func removeEmptyCourses(courses []string) []string { + var filteredCourses []string + + for index, course := range courses { + if functions.OnlyWhitespace(course) || len(course) == 0 { + filteredCourses = append(courses[:index], courses[index+1:]...) + } + } + return filteredCourses +}