diff --git a/backend/service/functions/time/parse.go b/backend/service/functions/time/parse.go index 9381372..72eb675 100644 --- a/backend/service/functions/time/parse.go +++ b/backend/service/functions/time/parse.go @@ -1,7 +1,20 @@ package time -import "time" +import ( + "github.com/pocketbase/pocketbase/tools/types" + "log/slog" + "time" +) func ParseTime(timeString string) (time.Time, error) { return time.Parse("2006-01-02T15:04:05Z", timeString) } + +func ParseAsTypesDatetime(time time.Time) types.DateTime { + dateTime, err := types.ParseDateTime(time) + if err != nil { + slog.Error("Failed to parse time as types.DateTime: %v", err) + return types.DateTime{} + } + return dateTime +} diff --git a/backend/service/ical/icalFileGeneration_test.go b/backend/service/ical/icalFileGeneration_test.go index 4eccc99..f412466 100644 --- a/backend/service/ical/icalFileGeneration_test.go +++ b/backend/service/ical/icalFileGeneration_test.go @@ -103,6 +103,118 @@ func TestIcalModel_EmitICal(t *testing.T) { }, }, }, + { + name: "Test Similar Events like Sport Courses", + fields: fields{ + Events: model.Events{ + { + UUID: "123", + Name: "Test", + Course: "Test", + EventType: "Test", + Notes: "Test", + Prof: "Test", + Rooms: "ZU430", + BookedAt: "Test", + Start: mockTime.ParseAsTypesDatetime(time.Date(2023, 12, 1, 0, 0, 0, 0, time.UTC)), + End: mockTime.ParseAsTypesDatetime(time.Date(2023, 12, 1, 1, 0, 0, 0, time.UTC)), + }, + { + UUID: "123", + Name: "Test", + Course: "Test", + EventType: "Test", + Notes: "Test", + Prof: "Test", + Rooms: "ZU221", + BookedAt: "Test", + Start: mockTime.ParseAsTypesDatetime(time.Date(2023, 12, 1, 0, 0, 0, 0, time.UTC)), + End: mockTime.ParseAsTypesDatetime(time.Date(2023, 12, 1, 1, 0, 0, 0, time.UTC)), + }, + }, + Mapping: map[string]model.FeedCollection{ + "123": { + UUID: "123", + Name: "Test", + Course: "Test", + UserDefinedName: "UserDefinedName", + }, + }, + }, + want: &goics.Component{ + Tipo: "VCALENDAR", + Elements: []goics.Componenter{ + &goics.Component{ + Tipo: "VTIMEZONE", + Elements: []goics.Componenter{ + &HtwkalenderComponent{ + Component: &goics.Component{ + Tipo: "STANDARD", + Elements: []goics.Componenter{}, + Properties: map[string][]string{ + "DTSTART": {"19701025T030000"}, + "RRULE": {"FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU"}, + "TZOFFSETFROM": {"+0200"}, + "TZOFFSETTO": {"+0100"}, + "TZNAME": {"CET"}, + }, + }, + }, + &HtwkalenderComponent{ + Component: &goics.Component{ + Tipo: "DAYLIGHT", + Elements: []goics.Componenter{}, + Properties: map[string][]string{ + "DTSTART": {"19700329T020000"}, + "TZOFFSETFROM": {"+0100"}, + "TZOFFSETTO": {"+0200"}, + "TZNAME": {"CEST"}, + "RRULE": {"FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU"}, + }, + }, + }, + }, + Properties: map[string][]string{ + "TZID": {"EUROPE/BERLIN"}, + }, + }, + &goics.Component{ + Tipo: "VEVENT", + Elements: []goics.Componenter{}, + Properties: map[string][]string{ + "DTSTAMP": {"20231201T000000Z"}, + "UID": {"b52a7a081f46eeba9b402114493278a34a48b572c84e53d7ac4da9dea15cdff2@htwkalender.de"}, + "DTEND": {"20231201T010000Z"}, + "DTSTART": {"20231201T000000Z"}, + "SUMMARY": {"UserDefinedName"}, + "DESCRIPTION": {"Notizen: Test\nProf: Test\nGruppe: Test\nTyp: Test\n"}, + "LOCATION": {"ZU430"}, + }, + }, + &goics.Component{ + Tipo: "VEVENT", + Elements: []goics.Componenter{}, + Properties: map[string][]string{ + "DTSTAMP": {"20231201T000000Z"}, + "UID": {"5e946c0c4474bc6e6337262093e3ef31477e026bbc6bab398d755b002506d9d7@htwkalender.de"}, + "DTEND": {"20231201T010000Z"}, + "DTSTART": {"20231201T000000Z"}, + "SUMMARY": {"UserDefinedName"}, + "DESCRIPTION": {"Notizen: Test\nProf: Test\nGruppe: Test\nTyp: Test\n"}, + "LOCATION": {"ZU221"}, + }, + }, + }, + Properties: map[string][]string{ + "PRODID": {"-//HTWK Kalender//htwkalender.de//DE"}, + "VERSION": {"2.0"}, + "CALSCALE": {"GREGORIAN"}, + "TZID": {"EUROPE/BERLIN"}, + "X-WR-CALNAME": {"HTWK Kalender"}, + "X-WR-TIMEZONE": {"EUROPE/BERLIN"}, + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {