From 7dafedd290d3c9721684f72c1c50629366042567 Mon Sep 17 00:00:00 2001 From: Conrad Hoffmann Date: Thu, 31 Mar 2022 12:30:14 +0200 Subject: [PATCH] Add type-safe precondition errors for CalDAV --- caldav/server.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/caldav/server.go b/caldav/server.go index 927d197..b0ea301 100644 --- a/caldav/server.go +++ b/caldav/server.go @@ -3,6 +3,7 @@ package caldav import ( "context" "encoding/xml" + "fmt" "net/http" "time" @@ -270,3 +271,35 @@ func (b *backend) Copy(r *http.Request, dest *internal.Href, recursive, overwrit func (b *backend) Move(r *http.Request, dest *internal.Href, overwrite bool) (created bool, err error) { panic("TODO") } + +// https://datatracker.ietf.org/doc/html/rfc4791#section-5.3.2.1 +type PreconditionType string + +const ( + PreconditionNoUIDConflict PreconditionType = "no-uid-conflict" + PreconditionSupportedCalendarData PreconditionType = "supported-calendar-data" + PreconditionSupportedCalendarComponent PreconditionType = "supported-calendar-component" + PreconditionValidCalendarData PreconditionType = "valid-calendar-data" + PreconditionValidCalendarObjectResource PreconditionType = "valid-calendar-object-resource" + PreconditionCalendarCollectionLocationOk PreconditionType = "calendar-collection-location-ok" + PreconditionMaxResourceSize PreconditionType = "max-resource-size" + PreconditionMinDateTime PreconditionType = "min-date-time" + PreconditionMaxDateTime PreconditionType = "max-date-time" + PreconditionMaxInstances PreconditionType = "max-instances" + PreconditionMaxAttendeesPerInstance PreconditionType = "max-attendees-per-instance" +) + +func NewPreconditionError(err PreconditionType) error { + name := xml.Name{"urn:ietf:params:xml:ns:caldav", string(err)} + elem := internal.NewRawXMLElement(name, nil, nil) + e := internal.Error{ + Raw: []internal.RawXMLValue{ + *elem, + }, + } + return &internal.DAVError{ + Code: 409, + Msg: fmt.Sprintf("precondition not met: %s", string(err)), + Err: e, + } +}