Liu Song’s Projects


~/Projects/webdav-go

git clone https://code.lsong.org/webdav-go

Commit

Commit
7dafedd290d3c9721684f72c1c50629366042567
Author
Conrad Hoffmann <[email protected]>
Date
2022-03-31 12:30:14 +0200 +0200
Diffstat
 caldav/server.go | 33 +++++++++++++++++++++++++++++++++

Add type-safe precondition errors for CalDAV


diff --git a/caldav/server.go b/caldav/server.go
index 927d197c2eedae2d4c7f129148c0cc7cf0b46458..b0ea30166cf624586eb69d1ef876e4120697fc34 100644
--- a/caldav/server.go
+++ b/caldav/server.go
@@ -3,6 +3,7 @@
 import (
 	"context"
 	"encoding/xml"
+	"fmt"
 	"net/http"
 	"time"
 
@@ -270,3 +271,35 @@
 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,
+	}
+}