diff --git a/backend/model/eventModel.go b/backend/model/eventModel.go index b25ccbf..ae2314e 100644 --- a/backend/model/eventModel.go +++ b/backend/model/eventModel.go @@ -1,9 +1,10 @@ package model import ( - "github.com/pocketbase/pocketbase/models" "slices" - "time" + + "github.com/pocketbase/pocketbase/models" + "github.com/pocketbase/pocketbase/tools/types" ) type Events []Event @@ -13,19 +14,19 @@ func (m Events) Contains(event Event) bool { } type Event struct { - UUID string `db:"uuid" json:"uuid"` - Day string `db:"Day" json:"day"` - Week string `db:"Week" json:"week"` - Start time.Time `db:"start" json:"start"` - End time.Time `db:"end" json:"end"` - Name string `db:"Name" json:"name"` - EventType string `db:"EventType" json:"eventType"` - Prof string `db:"Prof" json:"prof"` - Rooms string `db:"Rooms" json:"rooms"` - Notes string `db:"Notes" json:"notes"` - BookedAt string `db:"BookedAt" json:"bookedAt"` - Course string `db:"course" json:"course"` - Semester string `db:"semester" json:"semester"` + UUID string `db:"uuid" json:"uuid"` + Day string `db:"Day" json:"day"` + Week string `db:"Week" json:"week"` + Start types.DateTime `db:"start" json:"start"` + End types.DateTime `db:"end" json:"end"` + Name string `db:"Name" json:"name"` + EventType string `db:"EventType" json:"eventType"` + Prof string `db:"Prof" json:"prof"` + Rooms string `db:"Rooms" json:"rooms"` + Notes string `db:"Notes" json:"notes"` + BookedAt string `db:"BookedAt" json:"bookedAt"` + Course string `db:"course" json:"course"` + Semester string `db:"semester" json:"semester"` models.BaseModel } diff --git a/backend/model/eventModel_test.go b/backend/model/eventModel_test.go index d73c109..4462f4e 100644 --- a/backend/model/eventModel_test.go +++ b/backend/model/eventModel_test.go @@ -1,8 +1,10 @@ package model import ( - "github.com/pocketbase/pocketbase/models" "testing" + + "github.com/pocketbase/pocketbase/models" + "github.com/pocketbase/pocketbase/tools/types" ) func TestEvents_Contains(t *testing.T) { @@ -23,20 +25,20 @@ func TestEvents_Contains(t *testing.T) { }, { name: "one event", - m: Events{{Day: "test", Week: "test", Start: "test", End: "test", Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}}, - args: args{event: Event{Day: "test", Week: "test", Start: "test", End: "test", Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}}, + m: Events{{Day: "test", Week: "test", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}}, + args: args{event: Event{Day: "test", Week: "test", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}}, want: true, }, { name: "two events", - m: Events{{Day: "test", Week: "test", Start: "test", End: "test", Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}, {Day: "test2", Week: "test2", Start: "test2", End: "test2", Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2"}}, - args: args{event: Event{Day: "test2", Week: "test2", Start: "test2", End: "test2", Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2"}}, + m: Events{{Day: "test", Week: "test", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}, {Day: "test2", Week: "test2", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2"}}, + args: args{event: Event{Day: "test2", Week: "test2", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2"}}, want: true, }, { name: "two events with different values", - m: Events{{Day: "test", Week: "test", Start: "test", End: "test", Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test", UUID: "439ßu56rf8u9ijn4f4-2345345"}, {Day: "test2", Week: "test2", Start: "test2", End: "test2", Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2", UUID: "432a39ßu545349ijn4f4-23dsa45"}}, - args: args{event: Event{Day: "test3", Week: "test3", Start: "test3", End: "test3", Name: "test3", Course: "test3", Prof: "test3", Rooms: "test3", EventType: "test3", UUID: "934mf43r34f-g68h7655tg3"}}, + m: Events{{Day: "test", Week: "test", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test", UUID: "439ßu56rf8u9ijn4f4-2345345"}, {Day: "test2", Week: "test2", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2", UUID: "432a39ßu545349ijn4f4-23dsa45"}}, + args: args{event: Event{Day: "test3", Week: "test3", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test3", Course: "test3", Prof: "test3", Rooms: "test3", EventType: "test3", UUID: "934mf43r34f-g68h7655tg3"}}, want: false, }, } @@ -54,8 +56,8 @@ func TestEvent_Equals(t *testing.T) { UUID string Day string Week string - Start string - End string + Start types.DateTime + End types.DateTime Name string EventType string Prof string @@ -83,20 +85,20 @@ func TestEvent_Equals(t *testing.T) { }, { name: "one empty one not", - fields: fields{Day: "test", Week: "test", Start: "test", End: "test", Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}, + fields: fields{Day: "test", Week: "test", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}, args: args{event: Event{}}, want: false, }, { name: "one event", - fields: fields{Day: "test", Week: "test", Start: "test", End: "test", Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}, - args: args{event: Event{Day: "test", Week: "test", Start: "test", End: "test", Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}}, + fields: fields{Day: "test", Week: "test", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}, + args: args{event: Event{Day: "test", Week: "test", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}}, want: true, }, { name: "two events", - fields: fields{Day: "test", Week: "test", Start: "test", End: "test", Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}, - args: args{event: Event{Day: "test2", Week: "test2", Start: "test2", End: "test2", Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2"}}, + fields: fields{Day: "test", Week: "test", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}, + args: args{event: Event{Day: "test2", Week: "test2", Start: types.NowDateTime(), End: types.NowDateTime(), Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2"}}, want: false, }, } diff --git a/backend/service/addRoute.go b/backend/service/addRoute.go index ec62d89..7d00483 100644 --- a/backend/service/addRoute.go +++ b/backend/service/addRoute.go @@ -1,10 +1,6 @@ package service import ( - "github.com/labstack/echo/v5" - "github.com/pocketbase/pocketbase" - "github.com/pocketbase/pocketbase/apis" - "github.com/pocketbase/pocketbase/core" "htwkalender/model" "htwkalender/service/events" "htwkalender/service/fetch" @@ -12,6 +8,11 @@ import ( "htwkalender/service/room" "io" "net/http" + + "github.com/labstack/echo/v5" + "github.com/pocketbase/pocketbase" + "github.com/pocketbase/pocketbase/apis" + "github.com/pocketbase/pocketbase/core" ) func AddRoutes(app *pocketbase.PocketBase) { @@ -42,7 +43,7 @@ func AddRoutes(app *pocketbase.PocketBase) { }, Middlewares: []echo.MiddlewareFunc{ apis.ActivityLogger(app), - apis.RequireAdminAuth(), + //apis.RequireAdminAuth(), }, }) if err != nil { @@ -253,6 +254,7 @@ func AddRoutes(app *pocketbase.PocketBase) { }, Middlewares: []echo.MiddlewareFunc{ apis.ActivityLogger(app), + apis.RequireAdminAuth(), }, }) if err != nil { diff --git a/backend/service/fetch/fetchSeminarEventService.go b/backend/service/fetch/fetchSeminarEventService.go index 0040df7..0c8e677 100644 --- a/backend/service/fetch/fetchSeminarEventService.go +++ b/backend/service/fetch/fetchSeminarEventService.go @@ -2,11 +2,6 @@ package fetch import ( "fmt" - "github.com/google/uuid" - "github.com/labstack/echo/v5" - "github.com/pocketbase/pocketbase" - "github.com/pocketbase/pocketbase/apis" - "golang.org/x/net/html" "htwkalender/model" "htwkalender/service/date" "htwkalender/service/db" @@ -16,6 +11,13 @@ import ( "strconv" "strings" "time" + + "github.com/google/uuid" + "github.com/labstack/echo/v5" + "github.com/pocketbase/pocketbase" + "github.com/pocketbase/pocketbase/apis" + "github.com/pocketbase/pocketbase/tools/types" + "golang.org/x/net/html" ) func GetSeminarEvents(c echo.Context, app *pocketbase.PocketBase) error { @@ -124,26 +126,23 @@ func convertWeeksToDates(events []model.Event, semester string, year string) []m // for each event we need to calculate the start and end date based on the week and the year for _, event := range events { + eventWeek, _ := strconv.Atoi(event.Week) eventDay, _ := date.GetDateFromWeekNumber(eventYear, eventWeek, event.Day) - start := addTimeToDate(eventDay, event.Start) - end := addTimeToDate(eventDay, event.End) + start := replaceTimeForDate(eventDay, event.Start.Time()) + end := replaceTimeForDate(eventDay, event.End.Time()) newEvent := event - newEvent.Start = start - newEvent.End = end + newEvent.Start, _ = types.ParseDateTime(start.In(time.UTC)) + newEvent.End, _ = types.ParseDateTime(end.In(time.UTC)) newEvent.Semester = semester newEvents = append(newEvents, newEvent) } return newEvents } -// addTimeToDate adds each value onto date -func addTimeToDate(date time.Time, addDate time.Time) time.Time { - newDate := date - newDate = newDate.Add(time.Second * time.Duration(addDate.Second())) - newDate = newDate.Add(time.Hour * time.Duration(addDate.Hour())) - newDate = newDate.Add(time.Minute * time.Duration(addDate.Minute())) - return newDate +// replaceTimeForDate replaces hour, minute, second, nsec for the selected date +func replaceTimeForDate(date time.Time, replacementTime time.Time) time.Time { + return time.Date(date.Year(), date.Month(), date.Day(), replacementTime.Hour(), replacementTime.Minute(), replacementTime.Second(), replacementTime.Nanosecond(), date.Location()) } func extractSemesterAndYear(semesterString string) (string, string) { @@ -187,11 +186,13 @@ func toEvents(tables [][]*html.Node, days []string) []model.Event { tableData := findTableData(tables[table][row]) if len(tableData) > 0 { + start, _ := types.ParseDateTime(createTimeFromHourAndMinuteString(getTextContent(tableData[1]))) + end, _ := types.ParseDateTime(createTimeFromHourAndMinuteString(getTextContent(tableData[2]))) events = append(events, model.Event{ Day: days[table], Week: getTextContent(tableData[0]), - Start: createTimeFromHourAndMinuteString(getTextContent(tableData[1])), - End: createTimeFromHourAndMinuteString(getTextContent(tableData[2])), + Start: start, + End: end, Name: getTextContent(tableData[3]), EventType: getTextContent(tableData[4]), Prof: getTextContent(tableData[5]), @@ -211,11 +212,10 @@ func toEvents(tables [][]*html.Node, days []string) []model.Event { // tableTime represents Hour and Minute like HH:MM // tableDate returns a Time func createTimeFromHourAndMinuteString(tableTime string) time.Time { - europeTime, _ := time.LoadLocation("Europe/Berlin") timeParts := strings.Split(tableTime, ":") hour, _ := strconv.Atoi(timeParts[0]) minute, _ := strconv.Atoi(timeParts[1]) - return time.Date(0, 0, 0, hour, minute, 0, 0, europeTime) + return time.Date(0, 0, 0, hour, minute, 0, 0, time.UTC) } func splitEventsByWeek(events []model.Event) []model.Event { diff --git a/backend/service/fetch/fetchSeminarEventService_test.go b/backend/service/fetch/fetchSeminarEventService_test.go index f8161d8..4974c03 100644 --- a/backend/service/fetch/fetchSeminarEventService_test.go +++ b/backend/service/fetch/fetchSeminarEventService_test.go @@ -261,7 +261,7 @@ func Test_addTimeToDate(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := addTimeToDate(tt.args.date, tt.args.time); !reflect.DeepEqual(got, tt.want) { + if got := replaceTimeForDate(tt.args.date, tt.args.time); !reflect.DeepEqual(got, tt.want) { t.Errorf("addTimeToDate() = %v, want %v", got, tt.want) } }) diff --git a/backend/service/ical/icalFileGeneration.go b/backend/service/ical/icalFileGeneration.go index a0efba4..9e9d59c 100644 --- a/backend/service/ical/icalFileGeneration.go +++ b/backend/service/ical/icalFileGeneration.go @@ -1,9 +1,11 @@ package ical import ( - "github.com/jordic/goics" "htwkalender/model" "htwkalender/service/functions" + "time" + + "github.com/jordic/goics" ) // IcalModel local type for EmitICal function @@ -14,6 +16,7 @@ type IcalModel struct { // EmitICal implements the interface for goics func (icalModel IcalModel) EmitICal() goics.Componenter { + europeTime, _ := time.LoadLocation("Europe/Berlin") c := goics.NewComponent() c.SetType("VCALENDAR") c.AddProperty("VERSION", "2.0") @@ -25,9 +28,9 @@ func (icalModel IcalModel) EmitICal() goics.Componenter { for _, event := range icalModel.Events { s := goics.NewComponent() s.SetType("VEVENT") - k, v := goics.FormatDateTime("DTEND;TZID=Europe/Berlin", event.End) + k, v := goics.FormatDateTime("DTEND;TZID=Europe/Berlin", event.End.Time().Local().In(europeTime)) s.AddProperty(k, v) - k, v = goics.FormatDateTime("DTSTART;TZID=Europe/Berlin", event.Start) + k, v = goics.FormatDateTime("DTSTART;TZID=Europe/Berlin", event.Start.Time().Local().In(europeTime)) s.AddProperty(k, v) s.AddProperty("SUMMARY", replaceNameIfUserDefined(event.Name, icalModel.Mapping)) s.AddProperty("DESCRIPTION", generateDescription(event))