From 97daa7b73cf8ff99155de33ae52608ff58b0eb7d Mon Sep 17 00:00:00 2001 From: Elmar Kresse Date: Fri, 4 Oct 2024 18:35:09 +0200 Subject: [PATCH 1/3] feat:#56 added etag hash --- services/ical/model/eventModel.go | 12 ++++++++++++ services/ical/model/icalModel.go | 4 ++++ services/ical/service/ical/ical.go | 14 +++++++++----- services/ical/service/routes.go | 3 ++- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/services/ical/model/eventModel.go b/services/ical/model/eventModel.go index 2d92a0d..511ad22 100644 --- a/services/ical/model/eventModel.go +++ b/services/ical/model/eventModel.go @@ -37,6 +37,14 @@ func (events Events) Sort() { }) } +func (events Events) String() string { + var str strings.Builder + for _, event := range events { + str.WriteString(event.String()) + } + return str.String() +} + type AnonymizedEventDTO struct { Day string `db:"Day" json:"day"` Week string `db:"Week" json:"week"` @@ -109,3 +117,7 @@ func (e *Event) GetName() string { func (e *Event) SetName(name string) { e.Name = name } + +func (e *Event) String() string { + return e.UUID + e.Day + e.Week + e.Start.String() + e.End.String() + e.Name + e.EventType + e.Compulsory + e.Prof + e.Rooms + e.Notes + e.BookedAt + e.Course + e.Semester +} diff --git a/services/ical/model/icalModel.go b/services/ical/model/icalModel.go index 14121fd..e5cab49 100644 --- a/services/ical/model/icalModel.go +++ b/services/ical/model/icalModel.go @@ -92,3 +92,7 @@ func ToJSONTime(timeString string) JSONTime { } return JSONTime(t) } + +func (j JSONTime) String() string { + return time.Time(j).Format(DefaultDateLayout) +} diff --git a/services/ical/service/ical/ical.go b/services/ical/service/ical/ical.go index ba8e7f2..11759e0 100644 --- a/services/ical/service/ical/ical.go +++ b/services/ical/service/ical/ical.go @@ -23,6 +23,7 @@ import ( "htwkalender/ical/model" "htwkalender/ical/service/connector" htwkalenderGrpc "htwkalender/ical/service/connector/grpc" + "htwkalender/ical/service/functions" "log/slog" "time" ) @@ -31,7 +32,7 @@ const expirationTime = 5 * time.Minute var FeedDeletedError = fmt.Errorf("feed deleted") -func Feed(app model.AppType, token string) (string, error) { +func Feed(app model.AppType, token string) (string, string, error) { var events model.Events modules := map[string]model.FeedCollection{} @@ -47,17 +48,17 @@ func Feed(app model.AppType, token string) (string, error) { // get feed by token feed, err := htwkalenderGrpc.GetFeed(token, app.GrpcClient) if err != nil { - return "", err + return "", "", err } if feed.Deleted { - return "", FeedDeletedError + return "", "", FeedDeletedError } // Get all events for modules events, err = htwkalenderGrpc.GetEvents(feed.Modules, app.GrpcClient) if err != nil { - return "", err + return "", "", err } // Sort events by start date @@ -68,11 +69,14 @@ func Feed(app model.AppType, token string) (string, error) { } } + // Generate one Hash for E-TAG from all events and modules + etag := functions.HashString(events.String() + fmt.Sprint(modules)) + b := bytes.Buffer{} goics.NewICalEncode(&b).Encode(IcalModel{Events: events, Mapping: modules}) icalFeed := &model.FeedModel{Content: b.String(), ExpiresAt: model.JSONTime(time.Now().Add(expirationTime))} - return icalFeed.Content, nil + return icalFeed.Content, etag, nil } func FeedRecord(app model.AppType, token string) (model.FeedRecord, error) { diff --git a/services/ical/service/routes.go b/services/ical/service/routes.go index c92a0f7..99117fe 100644 --- a/services/ical/service/routes.go +++ b/services/ical/service/routes.go @@ -34,7 +34,7 @@ func AddFeedRoutes(app model.AppType) { app.Fiber.Get("/api/feed", func(c fiber.Ctx) error { token := c.Query("token") - results, err := ical.Feed(app, token) + results, eTag, err := ical.Feed(app, token) if errors.Is(err, ical.FeedDeletedError) { return c.SendStatus(fiber.StatusGone) @@ -48,6 +48,7 @@ func AddFeedRoutes(app model.AppType) { c.Response().Header.Set("charset", "utf-8") c.Response().Header.Set("Content-Disposition", "inline") c.Response().Header.Set("filename", "calendar.ics") + c.Response().Header.Set("ETag", eTag) return c.SendString(results) }) From c85a0edb7c94400456d983d8a4a52198eeb3d51f Mon Sep 17 00:00:00 2001 From: Elmar Kresse Date: Sat, 5 Oct 2024 00:49:59 +0200 Subject: [PATCH 2/3] feat:#56 updated ifNoneMatch --- services/ical/service/routes.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/ical/service/routes.go b/services/ical/service/routes.go index 99117fe..d94f2b1 100644 --- a/services/ical/service/routes.go +++ b/services/ical/service/routes.go @@ -34,12 +34,17 @@ func AddFeedRoutes(app model.AppType) { app.Fiber.Get("/api/feed", func(c fiber.Ctx) error { token := c.Query("token") + ifNoneMatch := c.Get("If-None-Match") results, eTag, err := ical.Feed(app, token) if errors.Is(err, ical.FeedDeletedError) { return c.SendStatus(fiber.StatusGone) } + if ifNoneMatch == eTag { + return c.SendStatus(fiber.StatusNotModified) + } + if err != nil { slog.Error("Failed to get feed", "error", err, "token", token) return c.SendStatus(fiber.StatusNotFound) From a12f9590f370256c1abdd33250c99bcde7ee403d Mon Sep 17 00:00:00 2001 From: Elmar Kresse Date: Sat, 5 Oct 2024 01:07:26 +0200 Subject: [PATCH 3/3] fix:#56 reorder --- services/ical/service/routes.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/services/ical/service/routes.go b/services/ical/service/routes.go index d94f2b1..f7da962 100644 --- a/services/ical/service/routes.go +++ b/services/ical/service/routes.go @@ -41,14 +41,15 @@ func AddFeedRoutes(app model.AppType) { return c.SendStatus(fiber.StatusGone) } - if ifNoneMatch == eTag { - return c.SendStatus(fiber.StatusNotModified) - } - if err != nil { slog.Error("Failed to get feed", "error", err, "token", token) return c.SendStatus(fiber.StatusNotFound) } + + if ifNoneMatch == eTag && ifNoneMatch != "" { + return c.SendStatus(fiber.StatusNotModified) + } + c.Response().Header.Set("Content-type", "text/calendar") c.Response().Header.Set("charset", "utf-8") c.Response().Header.Set("Content-Disposition", "inline")