fix:#31 switch time format in functions and calendar

This commit is contained in:
masterelmar
2023-10-28 14:48:25 +02:00
parent 7228d17d84
commit 4aed6b58ee
6 changed files with 66 additions and 58 deletions

View File

@@ -1,9 +1,10 @@
package model package model
import ( import (
"github.com/pocketbase/pocketbase/models"
"slices" "slices"
"time"
"github.com/pocketbase/pocketbase/models"
"github.com/pocketbase/pocketbase/tools/types"
) )
type Events []Event type Events []Event
@@ -13,19 +14,19 @@ func (m Events) Contains(event Event) bool {
} }
type Event struct { type Event struct {
UUID string `db:"uuid" json:"uuid"` UUID string `db:"uuid" json:"uuid"`
Day string `db:"Day" json:"day"` Day string `db:"Day" json:"day"`
Week string `db:"Week" json:"week"` Week string `db:"Week" json:"week"`
Start time.Time `db:"start" json:"start"` Start types.DateTime `db:"start" json:"start"`
End time.Time `db:"end" json:"end"` End types.DateTime `db:"end" json:"end"`
Name string `db:"Name" json:"name"` Name string `db:"Name" json:"name"`
EventType string `db:"EventType" json:"eventType"` EventType string `db:"EventType" json:"eventType"`
Prof string `db:"Prof" json:"prof"` Prof string `db:"Prof" json:"prof"`
Rooms string `db:"Rooms" json:"rooms"` Rooms string `db:"Rooms" json:"rooms"`
Notes string `db:"Notes" json:"notes"` Notes string `db:"Notes" json:"notes"`
BookedAt string `db:"BookedAt" json:"bookedAt"` BookedAt string `db:"BookedAt" json:"bookedAt"`
Course string `db:"course" json:"course"` Course string `db:"course" json:"course"`
Semester string `db:"semester" json:"semester"` Semester string `db:"semester" json:"semester"`
models.BaseModel models.BaseModel
} }

View File

@@ -1,8 +1,10 @@
package model package model
import ( import (
"github.com/pocketbase/pocketbase/models"
"testing" "testing"
"github.com/pocketbase/pocketbase/models"
"github.com/pocketbase/pocketbase/tools/types"
) )
func TestEvents_Contains(t *testing.T) { func TestEvents_Contains(t *testing.T) {
@@ -23,20 +25,20 @@ func TestEvents_Contains(t *testing.T) {
}, },
{ {
name: "one event", name: "one event",
m: Events{{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: "test", End: "test", 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, want: true,
}, },
{ {
name: "two events", 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"}}, 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: "test2", End: "test2", 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, want: true,
}, },
{ {
name: "two events with different values", 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"}}, 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: "test3", End: "test3", Name: "test3", Course: "test3", Prof: "test3", Rooms: "test3", EventType: "test3", UUID: "934mf43r34f-g68h7655tg3"}}, 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, want: false,
}, },
} }
@@ -54,8 +56,8 @@ func TestEvent_Equals(t *testing.T) {
UUID string UUID string
Day string Day string
Week string Week string
Start string Start types.DateTime
End string End types.DateTime
Name string Name string
EventType string EventType string
Prof string Prof string
@@ -83,20 +85,20 @@ func TestEvent_Equals(t *testing.T) {
}, },
{ {
name: "one empty one not", 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{}}, args: args{event: Event{}},
want: false, want: false,
}, },
{ {
name: "one event", name: "one event",
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{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: types.NowDateTime(), End: types.NowDateTime(), Name: "test", Course: "test", Prof: "test", Rooms: "test", EventType: "test"}},
want: true, want: true,
}, },
{ {
name: "two events", name: "two events",
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{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: types.NowDateTime(), End: types.NowDateTime(), Name: "test2", Course: "test2", Prof: "test2", Rooms: "test2", EventType: "test2"}},
want: false, want: false,
}, },
} }

View File

@@ -1,10 +1,6 @@
package service package service
import ( import (
"github.com/labstack/echo/v5"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/core"
"htwkalender/model" "htwkalender/model"
"htwkalender/service/events" "htwkalender/service/events"
"htwkalender/service/fetch" "htwkalender/service/fetch"
@@ -12,6 +8,11 @@ import (
"htwkalender/service/room" "htwkalender/service/room"
"io" "io"
"net/http" "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) { func AddRoutes(app *pocketbase.PocketBase) {
@@ -42,7 +43,7 @@ func AddRoutes(app *pocketbase.PocketBase) {
}, },
Middlewares: []echo.MiddlewareFunc{ Middlewares: []echo.MiddlewareFunc{
apis.ActivityLogger(app), apis.ActivityLogger(app),
apis.RequireAdminAuth(), //apis.RequireAdminAuth(),
}, },
}) })
if err != nil { if err != nil {
@@ -253,6 +254,7 @@ func AddRoutes(app *pocketbase.PocketBase) {
}, },
Middlewares: []echo.MiddlewareFunc{ Middlewares: []echo.MiddlewareFunc{
apis.ActivityLogger(app), apis.ActivityLogger(app),
apis.RequireAdminAuth(),
}, },
}) })
if err != nil { if err != nil {

View File

@@ -2,11 +2,6 @@ package fetch
import ( import (
"fmt" "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/model"
"htwkalender/service/date" "htwkalender/service/date"
"htwkalender/service/db" "htwkalender/service/db"
@@ -16,6 +11,13 @@ import (
"strconv" "strconv"
"strings" "strings"
"time" "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 { 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 each event we need to calculate the start and end date based on the week and the year
for _, event := range events { for _, event := range events {
eventWeek, _ := strconv.Atoi(event.Week) eventWeek, _ := strconv.Atoi(event.Week)
eventDay, _ := date.GetDateFromWeekNumber(eventYear, eventWeek, event.Day) eventDay, _ := date.GetDateFromWeekNumber(eventYear, eventWeek, event.Day)
start := addTimeToDate(eventDay, event.Start) start := replaceTimeForDate(eventDay, event.Start.Time())
end := addTimeToDate(eventDay, event.End) end := replaceTimeForDate(eventDay, event.End.Time())
newEvent := event newEvent := event
newEvent.Start = start newEvent.Start, _ = types.ParseDateTime(start.In(time.UTC))
newEvent.End = end newEvent.End, _ = types.ParseDateTime(end.In(time.UTC))
newEvent.Semester = semester newEvent.Semester = semester
newEvents = append(newEvents, newEvent) newEvents = append(newEvents, newEvent)
} }
return newEvents return newEvents
} }
// addTimeToDate adds each value onto date // replaceTimeForDate replaces hour, minute, second, nsec for the selected date
func addTimeToDate(date time.Time, addDate time.Time) time.Time { func replaceTimeForDate(date time.Time, replacementTime time.Time) time.Time {
newDate := date return time.Date(date.Year(), date.Month(), date.Day(), replacementTime.Hour(), replacementTime.Minute(), replacementTime.Second(), replacementTime.Nanosecond(), date.Location())
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
} }
func extractSemesterAndYear(semesterString string) (string, string) { func extractSemesterAndYear(semesterString string) (string, string) {
@@ -187,11 +186,13 @@ func toEvents(tables [][]*html.Node, days []string) []model.Event {
tableData := findTableData(tables[table][row]) tableData := findTableData(tables[table][row])
if len(tableData) > 0 { if len(tableData) > 0 {
start, _ := types.ParseDateTime(createTimeFromHourAndMinuteString(getTextContent(tableData[1])))
end, _ := types.ParseDateTime(createTimeFromHourAndMinuteString(getTextContent(tableData[2])))
events = append(events, model.Event{ events = append(events, model.Event{
Day: days[table], Day: days[table],
Week: getTextContent(tableData[0]), Week: getTextContent(tableData[0]),
Start: createTimeFromHourAndMinuteString(getTextContent(tableData[1])), Start: start,
End: createTimeFromHourAndMinuteString(getTextContent(tableData[2])), End: end,
Name: getTextContent(tableData[3]), Name: getTextContent(tableData[3]),
EventType: getTextContent(tableData[4]), EventType: getTextContent(tableData[4]),
Prof: getTextContent(tableData[5]), 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 // tableTime represents Hour and Minute like HH:MM
// tableDate returns a Time // tableDate returns a Time
func createTimeFromHourAndMinuteString(tableTime string) time.Time { func createTimeFromHourAndMinuteString(tableTime string) time.Time {
europeTime, _ := time.LoadLocation("Europe/Berlin")
timeParts := strings.Split(tableTime, ":") timeParts := strings.Split(tableTime, ":")
hour, _ := strconv.Atoi(timeParts[0]) hour, _ := strconv.Atoi(timeParts[0])
minute, _ := strconv.Atoi(timeParts[1]) 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 { func splitEventsByWeek(events []model.Event) []model.Event {

View File

@@ -261,7 +261,7 @@ func Test_addTimeToDate(t *testing.T) {
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { 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) t.Errorf("addTimeToDate() = %v, want %v", got, tt.want)
} }
}) })

View File

@@ -1,9 +1,11 @@
package ical package ical
import ( import (
"github.com/jordic/goics"
"htwkalender/model" "htwkalender/model"
"htwkalender/service/functions" "htwkalender/service/functions"
"time"
"github.com/jordic/goics"
) )
// IcalModel local type for EmitICal function // IcalModel local type for EmitICal function
@@ -14,6 +16,7 @@ type IcalModel struct {
// EmitICal implements the interface for goics // EmitICal implements the interface for goics
func (icalModel IcalModel) EmitICal() goics.Componenter { func (icalModel IcalModel) EmitICal() goics.Componenter {
europeTime, _ := time.LoadLocation("Europe/Berlin")
c := goics.NewComponent() c := goics.NewComponent()
c.SetType("VCALENDAR") c.SetType("VCALENDAR")
c.AddProperty("VERSION", "2.0") c.AddProperty("VERSION", "2.0")
@@ -25,9 +28,9 @@ func (icalModel IcalModel) EmitICal() goics.Componenter {
for _, event := range icalModel.Events { for _, event := range icalModel.Events {
s := goics.NewComponent() s := goics.NewComponent()
s.SetType("VEVENT") 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) 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(k, v)
s.AddProperty("SUMMARY", replaceNameIfUserDefined(event.Name, icalModel.Mapping)) s.AddProperty("SUMMARY", replaceNameIfUserDefined(event.Name, icalModel.Mapping))
s.AddProperty("DESCRIPTION", generateDescription(event)) s.AddProperty("DESCRIPTION", generateDescription(event))