mirror of
https://gitlab.dit.htwk-leipzig.de/htwk-software/htwkalender.git
synced 2025-08-10 13:43:49 +02:00
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:
@@ -39,8 +39,15 @@ func main() {
|
||||
}
|
||||
|
||||
grpcClient := grpc.ConnectGRPCServer(host)
|
||||
|
||||
// Close the grpc connection when the main function ends
|
||||
defer grpc.CloseGRPCServer(grpcClient)
|
||||
|
||||
// Log the grpc connection
|
||||
// Test the connection to the grpc server
|
||||
grpcClient.Connect()
|
||||
slog.Info("GRPC connection state", "state", grpcClient.GetState())
|
||||
|
||||
// Initialize a new Fiber app
|
||||
webdavRequestMethods := []string{"PROPFIND", "MKCOL", "COPY", "MOVE"}
|
||||
|
||||
@@ -64,7 +71,7 @@ func main() {
|
||||
|
||||
fiberApp.Use(logger.New(
|
||||
logger.Config{
|
||||
Format: "[${time}] ${status} - ${latency} ${method} ${path} ${error}\n",
|
||||
Format: "${time} | ${status} | ${latency} | ${method} - ${path} | ${error}\n",
|
||||
TimeFormat: "02-01-2006 15:04:05",
|
||||
},
|
||||
))
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -92,3 +92,7 @@ func ToJSONTime(timeString string) JSONTime {
|
||||
}
|
||||
return JSONTime(t)
|
||||
}
|
||||
|
||||
func (j JSONTime) String() string {
|
||||
return time.Time(j).Format(DefaultDateLayout)
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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) {
|
||||
|
@@ -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)
|
||||
})
|
||||
|
Reference in New Issue
Block a user