plugins/caldav: switch to path-based URLs
UIDs are not first-class WebDAV citizens and would require two roundtrips for most operations.
This commit is contained in:
parent
59547f7fb7
commit
0191b73996
4 changed files with 29 additions and 20 deletions
2
go.mod
2
go.mod
|
@ -14,7 +14,7 @@ require (
|
||||||
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21
|
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21
|
||||||
github.com/emersion/go-smtp v0.13.0
|
github.com/emersion/go-smtp v0.13.0
|
||||||
github.com/emersion/go-vcard v0.0.0-20200508080525-dd3110a24ec2
|
github.com/emersion/go-vcard v0.0.0-20200508080525-dd3110a24ec2
|
||||||
github.com/emersion/go-webdav v0.3.0
|
github.com/emersion/go-webdav v0.3.1-0.20200513144525-a4e0e8100397
|
||||||
github.com/google/uuid v1.1.1
|
github.com/google/uuid v1.1.1
|
||||||
github.com/gorilla/css v1.0.0 // indirect
|
github.com/gorilla/css v1.0.0 // indirect
|
||||||
github.com/labstack/echo/v4 v4.1.16
|
github.com/labstack/echo/v4 v4.1.16
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -40,8 +40,8 @@ github.com/emersion/go-vcard v0.0.0-20191221110513-5f81fa0d3cc7 h1:SE+tcd+0kn0cT
|
||||||
github.com/emersion/go-vcard v0.0.0-20191221110513-5f81fa0d3cc7/go.mod h1:HMJKR5wlh/ziNp+sHEDV2ltblO4JD2+IdDOWtGcQBTM=
|
github.com/emersion/go-vcard v0.0.0-20191221110513-5f81fa0d3cc7/go.mod h1:HMJKR5wlh/ziNp+sHEDV2ltblO4JD2+IdDOWtGcQBTM=
|
||||||
github.com/emersion/go-vcard v0.0.0-20200508080525-dd3110a24ec2 h1:g1RgqggIPPkEBubnOxAbIglxjMsP0aHPO2ryigBHu2s=
|
github.com/emersion/go-vcard v0.0.0-20200508080525-dd3110a24ec2 h1:g1RgqggIPPkEBubnOxAbIglxjMsP0aHPO2ryigBHu2s=
|
||||||
github.com/emersion/go-vcard v0.0.0-20200508080525-dd3110a24ec2/go.mod h1:HMJKR5wlh/ziNp+sHEDV2ltblO4JD2+IdDOWtGcQBTM=
|
github.com/emersion/go-vcard v0.0.0-20200508080525-dd3110a24ec2/go.mod h1:HMJKR5wlh/ziNp+sHEDV2ltblO4JD2+IdDOWtGcQBTM=
|
||||||
github.com/emersion/go-webdav v0.3.0 h1:I1J9xf7fa1NxXFWCKyN5Ju3Sa3jJeNMI3uJQKHYg0SY=
|
github.com/emersion/go-webdav v0.3.1-0.20200513144525-a4e0e8100397 h1:XVnGMemAywvBnsUAIsx4v+avxzauS00Mf9l9oM9olFc=
|
||||||
github.com/emersion/go-webdav v0.3.0/go.mod h1:uSM1VveeKtogBVWaYccTksToczooJ0rrVGNsgnDsr4Q=
|
github.com/emersion/go-webdav v0.3.1-0.20200513144525-a4e0e8100397/go.mod h1:uSM1VveeKtogBVWaYccTksToczooJ0rrVGNsgnDsr4Q=
|
||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
|
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
{{range .Events}}
|
{{range .Events}}
|
||||||
{{$event := index .Data.Events 0}}
|
{{$event := index .Data.Events 0}}
|
||||||
<li>
|
<li>
|
||||||
<a href="/calendar/{{$event.Props.Text "UID" | pathescape}}">{{$event.Props.Text "SUMMARY"}}</a>
|
<a href="/calendar/{{$event.Path | pathescape}}">{{$event.Props.Text "SUMMARY"}}</a>
|
||||||
({{$event.DateTimeStart nil | formatdate}} — {{$event.DateTimeEnd nil | formatdate}})
|
({{$event.DateTimeStart nil | formatdate}} — {{$event.DateTimeEnd nil | formatdate}})
|
||||||
</li>
|
</li>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
"git.sr.ht/~emersion/alps"
|
"git.sr.ht/~emersion/alps"
|
||||||
"github.com/emersion/go-webdav/caldav"
|
"github.com/emersion/go-webdav/caldav"
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CalendarRenderData struct {
|
type CalendarRenderData struct {
|
||||||
|
@ -26,6 +27,15 @@ type EventRenderData struct {
|
||||||
|
|
||||||
var monthPageLayout = "2006-01"
|
var monthPageLayout = "2006-01"
|
||||||
|
|
||||||
|
func parseObjectPath(s string) (string, error) {
|
||||||
|
p, err := url.PathUnescape(s)
|
||||||
|
if err != nil {
|
||||||
|
err = fmt.Errorf("failed to parse path: %v", err)
|
||||||
|
return "", echo.NewHTTPError(http.StatusBadRequest, err)
|
||||||
|
}
|
||||||
|
return string(p), nil
|
||||||
|
}
|
||||||
|
|
||||||
func registerRoutes(p *alps.GoPlugin, u *url.URL) {
|
func registerRoutes(p *alps.GoPlugin, u *url.URL) {
|
||||||
p.GET("/calendar", func(ctx *alps.Context) error {
|
p.GET("/calendar", func(ctx *alps.Context) error {
|
||||||
var start time.Time
|
var start time.Time
|
||||||
|
@ -86,15 +96,23 @@ func registerRoutes(p *alps.GoPlugin, u *url.URL) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
p.GET("/calendar/:uid", func(ctx *alps.Context) error {
|
p.GET("/calendar/:path", func(ctx *alps.Context) error {
|
||||||
uid := ctx.Param("uid")
|
path, err := parseObjectPath(ctx.Param("path"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c, err := newClient(u, ctx.Session)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
c, calendar, err := getCalendar(u, ctx.Session)
|
c, calendar, err := getCalendar(u, ctx.Session)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
query := caldav.CalendarQuery{
|
multiGet := caldav.CalendarMultiGet{
|
||||||
CompRequest: caldav.CalendarCompRequest{
|
CompRequest: caldav.CalendarCompRequest{
|
||||||
Name: "VCALENDAR",
|
Name: "VCALENDAR",
|
||||||
Props: []string{"VERSION"},
|
Props: []string{"VERSION"},
|
||||||
|
@ -110,23 +128,14 @@ func registerRoutes(p *alps.GoPlugin, u *url.URL) {
|
||||||
},
|
},
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
CompFilter: caldav.CompFilter{
|
|
||||||
Name: "VCALENDAR",
|
|
||||||
Comps: []caldav.CompFilter{{
|
|
||||||
Name: "VEVENT",
|
|
||||||
Props: []caldav.PropFilter{{
|
|
||||||
Name: "UID",
|
|
||||||
TextMatch: &caldav.TextMatch{Text: uid},
|
|
||||||
}},
|
|
||||||
}},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
events, err := c.QueryCalendar(calendar.Path, &query)
|
|
||||||
|
events, err := c.MultiGetCalendar(path, &multiGet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to query calendar: %v", err)
|
return fmt.Errorf("failed to multi-get calendar: %v", err)
|
||||||
}
|
}
|
||||||
if len(events) != 1 {
|
if len(events) != 1 {
|
||||||
return fmt.Errorf("expected exactly one calendar object with UID %q, got %v", uid, len(events))
|
return fmt.Errorf("expected exactly one calendar object with path %q, got %v", path, len(events))
|
||||||
}
|
}
|
||||||
event := &events[0]
|
event := &events[0]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue