From 5b78cdc104961f8cbd870513dee75dd823c6e4c6 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 5 Feb 2020 18:08:00 +0100 Subject: plugins/caldav: new plugin For now it can only list events for the current month. References: https://todo.sr.ht/~sircmpwn/koushin/60 --- plugins/caldav/routes.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 plugins/caldav/routes.go (limited to 'plugins/caldav/routes.go') diff --git a/plugins/caldav/routes.go b/plugins/caldav/routes.go new file mode 100644 index 0000000..acc879f --- /dev/null +++ b/plugins/caldav/routes.go @@ -0,0 +1,66 @@ +package koushincaldav + +import ( + "fmt" + "net/http" + "net/url" + "time" + + "git.sr.ht/~emersion/koushin" + "github.com/emersion/go-webdav/caldav" +) + +type CalendarRenderData struct { + koushin.BaseRenderData + Calendar *caldav.Calendar + Events []caldav.CalendarObject +} + +func registerRoutes(p *koushin.GoPlugin, u *url.URL) { + p.GET("/calendar", func(ctx *koushin.Context) error { + // TODO: multi-calendar support + c, calendar, err := getCalendar(u, ctx.Session) + if err != nil { + return err + } + + now := time.Now() + start := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location()) + end := start.AddDate(0, 1, 0) + + query := caldav.CalendarQuery{ + CompRequest: caldav.CalendarCompRequest{ + Name: "VCALENDAR", + Props: []string{"VERSION"}, + Comps: []caldav.CalendarCompRequest{{ + Name: "VEVENT", + Props: []string{ + "SUMMARY", + "UID", + "DTSTART", + "DTEND", + "DURATION", + }, + }}, + }, + CompFilter: caldav.CompFilter{ + Name: "VCALENDAR", + Comps: []caldav.CompFilter{{ + Name: "VEVENT", + Start: start, + End: end, + }}, + }, + } + events, err := c.QueryCalendar(calendar.Path, &query) + if err != nil { + return fmt.Errorf("failed to query calendar: %v", err) + } + + return ctx.Render(http.StatusOK, "calendar.html", &CalendarRenderData{ + BaseRenderData: *koushin.NewBaseRenderData(ctx), + Calendar: calendar, + Events: events, + }) + }) +} -- cgit v1.2.3