Merge branch 'refs/heads/development' into 49-add-htwkarte-linkout-at-ics-event-info

# Conflicts:
#	services/ical/main.go
#	services/ical/service/ical/ical.go
#	services/ical/service/routes.go
This commit is contained in:
Elmar Kresse
2024-10-17 10:54:29 +02:00
26 changed files with 883 additions and 40 deletions

View File

@@ -19,14 +19,31 @@ package grpc
import (
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/keepalive"
"log/slog"
"sync"
"time"
)
var conn *grpc.ClientConn
var once sync.Once
func ConnectGRPCServer(host string) *grpc.ClientConn {
conn, err := grpc.NewClient(host+":50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
slog.Error("could not connect to grpc server", "error", err)
}
once.Do(func() {
var err error
conn, err = grpc.NewClient(
host+":50051",
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithKeepaliveParams(keepalive.ClientParameters{
Time: 2 * time.Minute,
Timeout: 20 * time.Second,
PermitWithoutStream: true,
}),
)
if err != nil {
slog.Error("could not connect to grpc server", "error", err)
}
})
return conn
}

View File

@@ -21,6 +21,7 @@ import (
"htwkalender/ical/model"
"htwkalender/ical/service/connector"
htwkalenderGrpc "htwkalender/ical/service/connector/grpc"
"htwkalender/ical/service/functions"
"log/slog"
"time"
)
@@ -29,7 +30,7 @@ const expirationTime = 5 * time.Minute
var FeedDeletedError = fmt.Errorf("feed deleted")
func Feed(app model.AppType, token string, userAgent string) (string, error) {
func Feed(app model.AppType, token string, userAgent string) (string, string, error) {
var events model.Events
modules := map[string]model.FeedCollection{}
@@ -45,17 +46,17 @@ func Feed(app model.AppType, token string, userAgent 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
@@ -66,10 +67,13 @@ func Feed(app model.AppType, token string, userAgent string) (string, error) {
}
}
// Generate one Hash for E-TAG from all events and modules
etag := functions.HashString(events.String() + fmt.Sprint(modules))
cal := GenerateIcalFeed(events, modules, userAgent)
icalFeed := &model.FeedModel{Content: cal.Serialize(), 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) {

View File

@@ -34,13 +34,12 @@ 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")
// get request userAgent and check if it is Thunderbird
userAgent := c.Get("User-Agent")
slog.Info("User-Agent", "userAgent", userAgent)
results, err := ical.Feed(app, token, userAgent)
results, eTag, err := ical.Feed(app, token, userAgent)
if errors.Is(err, ical.FeedDeletedError) {
return c.SendStatus(fiber.StatusGone)
@@ -50,10 +49,16 @@ func AddFeedRoutes(app model.AppType) {
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")
c.Response().Header.Set("filename", "calendar.ics")
c.Response().Header.Set("ETag", eTag)
return c.SendString(results)
})