diff --git a/backend/service/db/dbEvents.go b/backend/service/db/dbEvents.go index 2bc15b4..a89fdc6 100644 --- a/backend/service/db/dbEvents.go +++ b/backend/service/db/dbEvents.go @@ -100,24 +100,17 @@ func GetPlanForModules(app *pocketbase.PocketBase, modules []model.FeedCollectio return events } -func GetAllModulesForCourse(app *pocketbase.PocketBase, course string, semester string) ([]string, error) { - var events []struct { - Name string `db:"Name" json:"Name"` - } - - var eventArray []string +func GetAllModulesForCourse(app *pocketbase.PocketBase, course string, semester string) (model.Events, error) { + var events model.Events // get all events from event records in the events collection - err := app.Dao().DB().Select("Name").From("events").Where(dbx.NewExp("course = {:course} AND semester = {:semester}", dbx.Params{"course": course, "semester": semester})).Distinct(true).All(&events) + err := app.Dao().DB().Select("*").From("events").Where(dbx.NewExp("course = {:course} AND semester = {:semester}", dbx.Params{"course": course, "semester": semester})).Distinct(true).All(&events) if err != nil { print("Error while getting events from database: ", err) - return eventArray, err + return nil, err } - for _, event := range events { - eventArray = append(eventArray, event.Name) - } - return eventArray, nil + return events, nil } func GetAllModulesDistinct(app *pocketbase.PocketBase) (model.Events, error) { @@ -131,3 +124,26 @@ func GetAllModulesDistinct(app *pocketbase.PocketBase) (model.Events, error) { return events, nil } + +func DeleteAllEventsForCourse(app *pocketbase.PocketBase, course string, semester string) error { + _, err := app.Dao().DB().Delete("events", dbx.NewExp("course = {:course} AND semester = {:semester}", dbx.Params{"course": course, "semester": semester})).Execute() + + if err != nil { + print("Error while deleting events from database: ", err) + return err + } + + return nil +} + +func FindAllEventsByModule(app *pocketbase.PocketBase, moduleName string) (model.Events, error) { + var events model.Events + + err := app.Dao().DB().Select("*").From("events").Where(dbx.NewExp("Name = {:moduleName}", dbx.Params{"moduleName": moduleName})).All(&events) + if err != nil { + print("Error while getting events from database: ", err) + return nil, err + } + + return events, nil +} diff --git a/backend/service/events/courseService.go b/backend/service/events/courseService.go index daf9f09..8388925 100644 --- a/backend/service/events/courseService.go +++ b/backend/service/events/courseService.go @@ -1,12 +1,10 @@ package events import ( - "github.com/labstack/echo/v5" "github.com/pocketbase/pocketbase" "htwkalender/service/db" ) -func GetAllCourses(app *pocketbase.PocketBase, c echo.Context) error { - courses := db.GetAllCourses(app) - return c.JSON(200, courses) +func GetAllCourses(app *pocketbase.PocketBase) []string { + return db.GetAllCourses(app) } diff --git a/backend/service/events/eventService.go b/backend/service/events/eventService.go index 8878f0d..9d58624 100644 --- a/backend/service/events/eventService.go +++ b/backend/service/events/eventService.go @@ -3,21 +3,18 @@ package events import ( "github.com/labstack/echo/v5" "github.com/pocketbase/pocketbase" + "github.com/pocketbase/pocketbase/apis" "htwkalender/model" "htwkalender/service/db" + "htwkalender/service/fetch" "htwkalender/service/functions" ) -func GetModulesForCourseDistinct(app *pocketbase.PocketBase, c echo.Context, course string, semester string) error { +func GetModulesForCourseDistinct(app *pocketbase.PocketBase, course string, semester string) (model.Events, error) { modules, err := db.GetAllModulesForCourse(app, course, semester) - replaceEmptyEntryInStringArray(modules, "Sonderveranstaltungen") - - if err != nil { - return c.JSON(400, err) - } else { - return c.JSON(200, modules) - } + replaceEmptyEntry(modules, "Sonderveranstaltungen") + return modules, err } func replaceEmptyEntryInStringArray(modules []string, replacement string) { @@ -49,3 +46,80 @@ func GetAllModulesDistinct(app *pocketbase.PocketBase, c echo.Context) error { return c.JSON(200, modules) } } + +// GetModuleByName returns a module by its name +// If the module does not exist, an error is returned +// If the module exists, the module is returned +// Module is a struct that exists in database as events +func GetModuleByName(app *pocketbase.PocketBase, name string) (model.Module, error) { + events, err := db.FindAllEventsByModule(app, name) + + if err != nil || len(events) == 0 { + return model.Module{}, err + } else { + return model.Module{ + Name: name, + Events: events, + Prof: events[0].Prof, + Course: events[0].Course, + Semester: events[0].Semester, + }, nil + } +} + +// DeleteAllEventsByCourseAndSemester deletes all events for a course and a semester +// If the deletion was successful, nil is returned +// If the deletion was not successful, an error is returned +func DeleteAllEventsByCourseAndSemester(app *pocketbase.PocketBase, course string, semester string) error { + err := db.DeleteAllEventsForCourse(app, course, semester) + if err != nil { + return err + } else { + return nil + } +} + +// UpdateModulesForCourse updates all modules for a course +// Does Updates for ws and ss semester sequentially +// Update runs through the following steps: +// 1. Delete all events for the course and the semester +// 2. Fetch all events for the course and the semester +// 3. Save all events for the course and the semester +// If the update was successful, nil is returned +// If the update was not successful, an error is returned +func UpdateModulesForCourse(app *pocketbase.PocketBase, course string) error { + + var err error + err = DeleteAllEventsByCourseAndSemester(app, course, "ws") + if err != nil { + return err + } + + err = DeleteAllEventsByCourseAndSemester(app, course, "ss") + if err != nil { + return err + } + + //new string array with one element (course) + var courses []string + courses = append(courses, course) + + seminarGroups := fetch.GetSeminarGroupsEventsFromHTML(courses) + + collection, dbError := db.FindCollection(app, "events") + if dbError != nil { + return apis.NewNotFoundError("Collection not found", dbError) + } + + seminarGroups = fetch.ClearEmptySeminarGroups(seminarGroups) + + seminarGroups = fetch.ReplaceEmptyEventNames(seminarGroups) + + _, dbError = db.SaveEvents(seminarGroups, collection, app) + + if dbError != nil { + return apis.NewNotFoundError("Events could not be saved", dbError) + } + + return nil +} diff --git a/frontend/src/api/fetchCourse.ts b/frontend/src/api/fetchCourse.ts index 75bc575..2b4c2b6 100644 --- a/frontend/src/api/fetchCourse.ts +++ b/frontend/src/api/fetchCourse.ts @@ -24,8 +24,8 @@ export async function fetchModulesByCourseAndSemester( return response.json(); }) .then((modulesResponse) => { - modulesResponse.forEach((module: string) => - modules.push(new Module(module, course, module)), + modulesResponse.forEach((module: Module) => + modules.push(new Module(module.Id, module.Name, course, module.Name)), ); }); return modules; @@ -39,7 +39,7 @@ export async function fetchAllModules(): Promise { }) .then((responseModules: Module[]) => { responseModules.forEach((module: Module) => { - modules.push(new Module(module.Name, module.Course, module.Name)); + modules.push(new Module(module.Id, module.Name, module.Course, module.Name)); }); });