mirror of
https://github.com/1f349/go-webdav.git
synced 2024-12-22 00:04:19 +00:00
caldav: add MKCOL support
This commit is contained in:
parent
20fad80dff
commit
0ea114ec79
@ -228,3 +228,10 @@ func (r *reportReq) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
||||
|
||||
return d.DecodeElement(v, &start)
|
||||
}
|
||||
|
||||
type mkcolReq struct {
|
||||
XMLName xml.Name `xml:"DAV: mkcol"`
|
||||
ResourceType internal.ResourceType `xml:"set>prop>resourcetype"`
|
||||
DisplayName string `xml:"set>prop>displayname"`
|
||||
// TODO this could theoretically contain all addressbook properties?
|
||||
}
|
||||
|
@ -30,8 +30,11 @@ type PutCalendarObjectOptions struct {
|
||||
// Backend is a CalDAV server backend.
|
||||
type Backend interface {
|
||||
CalendarHomeSetPath(ctx context.Context) (string, error)
|
||||
|
||||
CreateCalendar(ctx context.Context, calendar *Calendar) error
|
||||
ListCalendars(ctx context.Context) ([]Calendar, error)
|
||||
GetCalendar(ctx context.Context, path string) (*Calendar, error)
|
||||
|
||||
GetCalendarObject(ctx context.Context, path string, req *CalendarCompRequest) (*CalendarObject, error)
|
||||
ListCalendarObjects(ctx context.Context, path string, req *CalendarCompRequest) ([]CalendarObject, error)
|
||||
QueryCalendarObjects(ctx context.Context, path string, query *CalendarQuery) ([]CalendarObject, error)
|
||||
@ -702,7 +705,28 @@ func (b *backend) Delete(r *http.Request) error {
|
||||
}
|
||||
|
||||
func (b *backend) Mkcol(r *http.Request) error {
|
||||
return internal.HTTPErrorf(http.StatusNotImplemented, "caldav: Mkcol not implemented")
|
||||
if b.resourceTypeAtPath(r.URL.Path) != resourceTypeCalendar {
|
||||
return internal.HTTPErrorf(http.StatusForbidden, "caldav: calendar creation not allowed at given location")
|
||||
}
|
||||
|
||||
cal := Calendar{
|
||||
Path: r.URL.Path,
|
||||
}
|
||||
|
||||
if !internal.IsRequestBodyEmpty(r) {
|
||||
var m mkcolReq
|
||||
if err := internal.DecodeXMLRequest(r, &m); err != nil {
|
||||
return internal.HTTPErrorf(http.StatusBadRequest, "carddav: error parsing mkcol request: %s", err.Error())
|
||||
}
|
||||
|
||||
if !m.ResourceType.Is(internal.CollectionName) || !m.ResourceType.Is(calendarName) {
|
||||
return internal.HTTPErrorf(http.StatusBadRequest, "carddav: unexpected resource type")
|
||||
}
|
||||
cal.Name = m.DisplayName
|
||||
// TODO ...
|
||||
}
|
||||
|
||||
return b.Backend.CreateCalendar(r.Context(), &cal)
|
||||
}
|
||||
|
||||
func (b *backend) Copy(r *http.Request, dest *internal.Href, recursive, overwrite bool) (created bool, err error) {
|
||||
|
@ -182,6 +182,10 @@ type testBackend struct {
|
||||
objectMap map[string][]CalendarObject
|
||||
}
|
||||
|
||||
func (t testBackend) CreateCalendar(ctx context.Context, calendar *Calendar) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t testBackend) ListCalendars(ctx context.Context) ([]Calendar, error) {
|
||||
return t.calendars, nil
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user