diff --git a/backend/model/eventModel.go b/backend/model/eventModel.go index baf1f7d..5daf446 100644 --- a/backend/model/eventModel.go +++ b/backend/model/eventModel.go @@ -1,16 +1,14 @@ package model -import "github.com/pocketbase/pocketbase/models" +import ( + "github.com/pocketbase/pocketbase/models" + "slices" +) type Events []Event func (m Events) Contains(event Event) bool { - for _, e := range m { - if e.Equals(event) { - return true - } - } - return false + return slices.Contains(m, event) } type Event struct { diff --git a/backend/model/eventModel_test.go b/backend/model/eventModel_test.go index 40b7ae4..d73c109 100644 --- a/backend/model/eventModel_test.go +++ b/backend/model/eventModel_test.go @@ -35,8 +35,8 @@ func TestEvents_Contains(t *testing.T) { }, { name: "two events with different values", - m: Events{{Day: "test", Week: "test", Start: "test", End: "test", Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}, {Day: "test2", Week: "test2", Start: "test2", End: "test2", Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2"}}, - args: args{event: Event{Day: "test3", Week: "test3", Start: "test3", End: "test3", Name: "test3", Course: "test3", Prof: "test3", Rooms: "test3", EventType: "test3"}}, + m: Events{{Day: "test", Week: "test", Start: "test", End: "test", Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test", UUID: "439ßu56rf8u9ijn4f4-2345345"}, {Day: "test2", Week: "test2", Start: "test2", End: "test2", Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2", UUID: "432a39ßu545349ijn4f4-23dsa45"}}, + args: args{event: Event{Day: "test3", Week: "test3", Start: "test3", End: "test3", Name: "test3", Course: "test3", Prof: "test3", Rooms: "test3", EventType: "test3", UUID: "934mf43r34f-g68h7655tg3"}}, want: false, }, } diff --git a/backend/service/db/dbEvents.go b/backend/service/db/dbEvents.go index d39fbd8..884d7bb 100644 --- a/backend/service/db/dbEvents.go +++ b/backend/service/db/dbEvents.go @@ -9,13 +9,19 @@ import ( func SaveEvents(seminarGroup []model.SeminarGroup, app *pocketbase.PocketBase) ([]model.Event, error) { var toBeSavedEvents model.Events var savedRecords model.Events + // check if event is already in database and add to toBeSavedEvents if not for _, seminarGroup := range seminarGroup { for _, event := range seminarGroup.Events { event = event.SetCourse(seminarGroup.Course) - dbGroup, err := findEventByDayWeekStartEndNameCourse(event, seminarGroup.Course, app) + existsInDatabase, err := findEventByDayWeekStartEndNameCourse(event, seminarGroup.Course, app) + alreadyAddedToSave := toBeSavedEvents.Contains(event) - if dbGroup.UUID != "" && err.Error() == "sql: no rows in result set" && toBeSavedEvents.Contains(event) == false { + if err != nil { + return nil, err + } + + if !existsInDatabase && !alreadyAddedToSave { toBeSavedEvents = append(toBeSavedEvents, event) } } @@ -36,12 +42,42 @@ func SaveEvents(seminarGroup []model.SeminarGroup, app *pocketbase.PocketBase) ( return savedRecords, nil } -func findEventByDayWeekStartEndNameCourse(event model.Event, course string, app *pocketbase.PocketBase) (*model.Event, error) { - err := app.Dao().DB().Select("*").From("events").Where( - dbx.NewExp("Day = {:day} AND Week = {:week} AND Start = {:start} AND End = {:end} AND Name = {:name} AND course = {:course} AND Prof = {:prof} AND Rooms = {:rooms} AND EventType = {:eventType}", - dbx.Params{"day": event.Day, "week": event.Week, "start": event.Start, "end": event.End, "name": event.Name, "course": course, "prof": event.Prof, "rooms": event.Rooms, "eventType": event.EventType}), - ).One(&event) - return &event, err +// check if event is already in database and return true if it is and false if it's not +func findEventByDayWeekStartEndNameCourse(event model.Event, course string, app *pocketbase.PocketBase) (bool, error) { + + var dbEvent model.Event + + err := app.Dao().DB().Select("*").From("events"). + Where(dbx.NewExp( + "Day = {:day} AND "+ + "Week = {:week} AND "+ + "Start = {:start} AND "+ + "End = {:end} AND "+ + "Name = {:name} AND "+ + "course = {:course} AND "+ + "Prof = {:prof} AND "+ + "Rooms = {:rooms} AND "+ + "EventType = {:eventType}", + dbx.Params{ + "day": event.Day, + "week": event.Week, + "start": event.Start, + "end": event.End, + "name": event.Name, + "course": course, + "prof": event.Prof, + "rooms": event.Rooms, + "eventType": event.EventType}), + ).One(&dbEvent) + + if err != nil { + if err.Error() == "sql: no rows in result set" { + return false, nil + } + return false, err + } else { + return true, nil + } } func buildIcalQueryForModules(modules []model.FeedCollection) dbx.Expression { diff --git a/backend/service/fetch/fetchSeminarEventService.go b/backend/service/fetch/fetchSeminarEventService.go index 972018b..da2dafb 100644 --- a/backend/service/fetch/fetchSeminarEventService.go +++ b/backend/service/fetch/fetchSeminarEventService.go @@ -31,7 +31,7 @@ func GetSeminarEvents(c echo.Context, app *pocketbase.PocketBase) error { savedRecords, dbError := db.SaveEvents(seminarGroups, app) if dbError != nil { - return apis.NewNotFoundError("Events could not be saved", dbError) + return apis.NewNotFoundError("Events could not be saved", dbError.Error()) } return c.JSON(http.StatusOK, savedRecords)