From 1e3fea26e3da2355c8fae65437d4a569d14f421b Mon Sep 17 00:00:00 2001 From: Elmar Kresse Date: Tue, 22 Apr 2025 16:46:08 +0200 Subject: [PATCH] fix:#65 reworked path param upgrade --- .../data-manager/service/addCalDavRoutes.go | 47 +++++----- services/data-manager/service/addRoute.go | 88 ++++--------------- services/data-manager/service/db/dbFeeds.go | 5 +- services/data-manager/service/ical/ical.go | 13 +-- 4 files changed, 49 insertions(+), 104 deletions(-) diff --git a/services/data-manager/service/addCalDavRoutes.go b/services/data-manager/service/addCalDavRoutes.go index eef5a86..d14e42a 100644 --- a/services/data-manager/service/addCalDavRoutes.go +++ b/services/data-manager/service/addCalDavRoutes.go @@ -19,38 +19,37 @@ package service import ( "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/core" + "htwkalender/data-manager/model" "htwkalender/data-manager/service/feed" "htwkalender/data-manager/service/ical" - "io" "log/slog" "net/http" ) -func addFeedRoutes(app *pocketbase.PocketBase) { - app.OnServe().BindFunc(func(se *core.ServeEvent) error { - se.Router.POST("/api/feed", func(e *core.RequestEvent) error { - requestBody, _ := io.ReadAll(e.Request.Body) - result, err := ical.CreateIndividualFeed(requestBody, app) - if err != nil { - slog.Error("Failed to create individual feed", "error", err) - return e.JSON(http.StatusInternalServerError, "Failed to create individual feed") - } - return e.JSON(http.StatusOK, result) - }) - return se.Next() +func addFeedRoutes(se *core.ServeEvent, pb *pocketbase.PocketBase) { + se.Router.POST("/api/feed", func(e *core.RequestEvent) error { + var feedCollection []model.FeedCollection + err := e.BindBody(&feedCollection) + if err != nil { + slog.Error("Failed to bind request body", "error", err) + return e.JSON(http.StatusBadRequest, "Invalid request body") + } + result, err := ical.CreateIndividualFeed(feedCollection, pb) + if err != nil { + slog.Error("Failed to create individual feed", "error", err) + return e.JSON(http.StatusInternalServerError, "Failed to create individual feed") + } + return e.JSON(http.StatusOK, result) }) - app.OnServe().BindFunc(func(se *core.ServeEvent) error { - se.Router.DELETE("/api/feed", func(e *core.RequestEvent) error { - token := e.Request.PathValue("token") - err := feed.MarkFeedForDeletion(app, token) - if err != nil { - return e.JSON(http.StatusNotFound, err) - } else { - return e.JSON(http.StatusOK, "Feed deleted") - } - }) - return se.Next() + se.Router.DELETE("/api/feed", func(e *core.RequestEvent) error { + token := e.Request.URL.Query().Get("token") + err := feed.MarkFeedForDeletion(pb, token) + if err != nil { + return e.JSON(http.StatusNotFound, err) + } else { + return e.JSON(http.StatusOK, "Feed deleted") + } }) } diff --git a/services/data-manager/service/addRoute.go b/services/data-manager/service/addRoute.go index 9b37885..898f712 100644 --- a/services/data-manager/service/addRoute.go +++ b/services/data-manager/service/addRoute.go @@ -43,21 +43,15 @@ func AddRoutes(services serviceModel.Service) { return e.JSON(http.StatusOK, savedEvents) } }).Bind(apis.RequireSuperuserAuth()) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/fetch/daily/events", func(e *core.RequestEvent) error { clock := time.RealClock{} course.UpdateCourse(services, clock) return e.JSON(http.StatusOK, "Daily events fetched") }).Bind(apis.RequireSuperuserAuth()) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/fetch/group", func(e *core.RequestEvent) error { - seminarGroupString := e.Request.PathValue("seminarGroup") + seminarGroupString := e.Request.URL.Query().Get("seminarGroup") if seminarGroupString == "" { return e.JSON(http.StatusBadRequest, "Seminar group could not be empty") @@ -76,10 +70,7 @@ func AddRoutes(services serviceModel.Service) { } }).Bind(apis.RequireSuperuserAuth()) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/fetch/groups", func(e *core.RequestEvent) error { groups, err := v1.FetchSeminarGroups(services.App) if err != nil { @@ -89,10 +80,7 @@ func AddRoutes(services serviceModel.Service) { return e.JSON(http.StatusOK, groups) } }).Bind(apis.RequireSuperuserAuth()) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/fetch/sports", func(e *core.RequestEvent) error { sportEvents, err := sport.FetchAndUpdateSportEvents(services.App) if err != nil { @@ -102,10 +90,7 @@ func AddRoutes(services serviceModel.Service) { return e.JSON(http.StatusOK, sportEvents) } }).Bind(apis.RequireSuperuserAuth()) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.DELETE("/api/modules", func(e *core.RequestEvent) error { err := services.EventService.DeleteAllEvents() if err != nil { @@ -113,10 +98,7 @@ func AddRoutes(services serviceModel.Service) { } return e.JSON(http.StatusOK, "Events deleted") }).Bind(apis.RequireSuperuserAuth()) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/rooms", func(e *core.RequestEvent) error { rooms, err := room.GetRooms(services.App) if err != nil { @@ -124,13 +106,10 @@ func AddRoutes(services serviceModel.Service) { } return e.JSON(http.StatusOK, rooms) }) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/schedule/day", func(e *core.RequestEvent) error { - roomParam := e.Request.PathValue("room") - date := e.Request.PathValue("date") + roomParam := e.Request.URL.Query().Get("room") + date := e.Request.URL.Query().Get("date") roomSchedule, err := room.GetRoomScheduleForDay(services.App, roomParam, date) if err != nil { slog.Error("Failed to get room schedule for day: ", "error", err) @@ -138,16 +117,12 @@ func AddRoutes(services serviceModel.Service) { } return e.JSON(http.StatusOK, roomSchedule) }) - return se.Next() - }) - // API Endpoint to create a new iCal feed - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/schedule", func(e *core.RequestEvent) error { - roomParam := e.Request.PathValue("room") - to := e.Request.PathValue("to") - from := e.Request.PathValue("from") - mapped := e.Request.PathValue("mapped") + roomParam := e.Request.URL.Query().Get("room") + to := e.Request.URL.Query().Get("to") + from := e.Request.URL.Query().Get("from") + mapped := e.Request.URL.Query().Get("mapped") roomSchedule, err := room.GetRoomSchedule(services.App, roomParam, from, to, mapped) if err != nil { slog.Error("Failed to get room schedule: ", "error", err) @@ -155,18 +130,14 @@ func AddRoutes(services serviceModel.Service) { } return e.JSON(http.StatusOK, roomSchedule) }) - return se.Next() - }) - // API Endpoint to get all rooms that have no events in a specific time frame - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/rooms/free", func(e *core.RequestEvent) error { - from, err := time.ParseTime(e.Request.PathValue("from")) + from, err := time.ParseTime(e.Request.URL.Query().Get("from")) if err != nil { slog.Error("Failed to parse time: ", "error", err) return e.JSON(http.StatusBadRequest, "Failed to parse time") } - to, err := time.ParseTime(e.Request.PathValue("to")) + to, err := time.ParseTime(e.Request.URL.Query().Get("to")) if err != nil { slog.Error("Failed to parse time: ", "error", err) return e.JSON(http.StatusBadRequest, "Failed to parse time") @@ -178,16 +149,11 @@ func AddRoutes(services serviceModel.Service) { } return e.JSON(http.StatusOK, rooms) }) - return se.Next() - }) - addFeedRoutes(services.App) - - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/course/modules", func(e *core.RequestEvent) error { modules, err := services.EventService.GetModulesForCourseDistinct( - e.Request.PathValue("course"), - e.Request.PathValue("semester"), + e.Request.URL.Query().Get("course"), + e.Request.URL.Query().Get("semester"), ) if err != nil { slog.Error("Failed to get modules for course and semester: ", "error", err) @@ -195,10 +161,7 @@ func AddRoutes(services serviceModel.Service) { } return e.JSON(http.StatusOK, modules) }) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/modules", func(e *core.RequestEvent) error { modules, err := services.EventService.GetAllModulesDistinct() if err != nil { @@ -207,12 +170,9 @@ func AddRoutes(services serviceModel.Service) { } return e.JSON(http.StatusOK, modules) }) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/module", func(e *core.RequestEvent) error { - requestModule := e.Request.PathValue("uuid") + requestModule := e.Request.URL.Query().Get("uuid") module, err := services.EventService.GetModuleByUUID(requestModule) if err != nil { slog.Error("Failed to get module: ", "error", err) @@ -220,12 +180,9 @@ func AddRoutes(services serviceModel.Service) { } return e.JSON(http.StatusOK, module) }) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/courses", func(e *core.RequestEvent) error { - semester := e.Request.PathValue("semester") + semester := e.Request.URL.Query().Get("semester") if semester == "" { courses := services.CourseService.GetAllCourses() return e.JSON(200, courses) @@ -238,12 +195,9 @@ func AddRoutes(services serviceModel.Service) { return e.JSON(200, courseStringList) } }) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/courses/events", func(e *core.RequestEvent) error { - semester := e.Request.PathValue("semester") + semester := e.Request.URL.Query().Get("semester") courses, err := services.CourseService.GetAllCoursesForSemesterWithEvents(semester) if err != nil { slog.Error("Failed to get courses for semester with events: ", "error", err) @@ -252,11 +206,7 @@ func AddRoutes(services serviceModel.Service) { return e.JSON(http.StatusOK, courses) } }) - return se.Next() - }) - // API Endpoint to get all eventTypes from the database distinct - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.GET("/api/events/types", func(e *core.RequestEvent) error { eventTypes, err := services.EventService.GetEventTypes() if err != nil { @@ -266,14 +216,11 @@ func AddRoutes(services serviceModel.Service) { return e.JSON(http.StatusOK, eventTypes) } }) - return se.Next() - }) - services.App.OnServe().BindFunc(func(se *core.ServeEvent) error { se.Router.DELETE("/api/events", func(e *core.RequestEvent) error { err := services.EventService.DeleteAllEventsByCourseAndSemester( - e.Request.PathValue("course"), - e.Request.PathValue("semester"), + e.Request.URL.Query().Get("course"), + e.Request.URL.Query().Get("semester"), ) if err != nil { slog.Error("Failed to delete events: ", "error", err) @@ -282,6 +229,9 @@ func AddRoutes(services serviceModel.Service) { return e.JSON(http.StatusOK, "Events deleted") } }).Bind(apis.RequireSuperuserAuth()) + + addFeedRoutes(se, services.App) + return se.Next() }) } diff --git a/services/data-manager/service/db/dbFeeds.go b/services/data-manager/service/db/dbFeeds.go index 680eff2..7357c08 100644 --- a/services/data-manager/service/db/dbFeeds.go +++ b/services/data-manager/service/db/dbFeeds.go @@ -49,7 +49,7 @@ func (f *Feed) GetRetrieved() types.DateTime { } func (f *Feed) SetRetrieved(retrieved types.DateTime) { - f.SetRetrieved(retrieved) + f.Set("retrieved", retrieved) } func (f *Feed) GetDeleted() bool { @@ -110,6 +110,9 @@ func (f *Feed) ToModel() model.Feed { Created: f.GetCreated(), Updated: f.GetUpdated(), Deleted: f.GetDeleted(), + BaseModel: core.BaseModel{ + Id: f.GetId(), + }, } } diff --git a/services/data-manager/service/ical/ical.go b/services/data-manager/service/ical/ical.go index c427445..d99e66b 100644 --- a/services/data-manager/service/ical/ical.go +++ b/services/data-manager/service/ical/ical.go @@ -24,24 +24,17 @@ import ( "htwkalender/data-manager/service/db" ) -func CreateIndividualFeed(requestBody []byte, app *pocketbase.PocketBase) (string, error) { - var modules []model.FeedCollection - - err := json.Unmarshal(requestBody, &modules) - if err != nil { - return "", apis.NewNotFoundError("Could not parse request body", err) - } - +func CreateIndividualFeed(modules []model.FeedCollection, pb *pocketbase.PocketBase) (string, error) { var icalFeed model.Feed jsonModules, _ := json.Marshal(modules) icalFeed.Modules = string(jsonModules) - collection, dbError := app.FindCollectionByNameOrId("feeds") + collection, dbError := pb.FindCollectionByNameOrId("feeds") if dbError != nil { return "", apis.NewNotFoundError("Collection could not be found", dbError) } - record, err := db.SaveFeed(icalFeed, collection, app) + record, err := db.SaveFeed(icalFeed, collection, pb) if err != nil { return "", apis.NewNotFoundError("Could not save feed", err) }