You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Walks the collection over loopback with the caller's forwarded auth,
parses events via a minimal vendored RFC 5545 layer (DAILY/WEEKLY
RRULE expansion; other shapes count the master occurrence, documented),
merges overlapping periods into a VFREEBUSY. TRANSP/CANCELLED are
free; supported-report-set advertises the report; plus a non-standard
GET /caldav/freebusy/<pod>?start&end extension. Findings: WAC-filtered
busy time is correct by construction — unreadable events are invisible
rather than busy, and it can't drift from server policy because it IS
server policy (the flip side, 'busy without details', needs a
weaker-than-Read mode — api.authorize territory); free-busy is
read-time O(N), another face of caldav's existing api.events gap, with
the wrinkle that a shared write-time index must answer 'indexed under
whose authority?'; and RFC 6638 scheduling needs cross-user delivery
loopback structurally cannot express (Outbox→Inbox is a write the
sender has no WAC right to make).
Copy file name to clipboardExpand all lines: caldav/README.md
+119-6Lines changed: 119 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -53,7 +53,10 @@ that can send one.
53
53
VEVENT `.ics` (ETag returned) → `PROPFIND Depth 1` lists it with that ETag +
54
54
`text/calendar` → `GET` returns the VEVENT → `REPORT calendar-multiget` returns
55
55
it inside `<CAL:calendar-data>` → `DELETE` → it's gone from the next `PROPFIND`.
56
-
All driven with a real pod Bearer through real WAC in `test.js` (15 tests).
56
+
Plus the free-busy slice: seed overlapping/adjacent/out-of-range/transparent/
57
+
recurring/WAC-hidden events → `REPORT free-busy-query` → exactly the merged
58
+
busy set comes back. All driven with a real pod Bearer through real WAC in
59
+
`test.js` (22 tests).
57
60
58
61
## What maps
59
62
@@ -64,24 +67,70 @@ All driven with a real pod Bearer through real WAC in `test.js` (15 tests).
64
67
|`PROPFIND` discovery | derives pod from `api.auth.getAgent`|`current-user-principal`, `principal-URL`, `calendar-home-set`|
65
68
|`REPORT``calendar-multiget`|`GET` per `<D:href>`| returns `getetag` + `<CAL:calendar-data>`|
66
69
|`REPORT``calendar-query`| lists the collection | returns **all** events (filter not evaluated — below) |
70
+
|`REPORT``free-busy-query`| lists the collection, `GET` per event | 200 `text/calendar` VFREEBUSY; merged busy periods from the VEVENTs in range (below) |
71
+
|`GET <prefix>/freebusy/<pod>?start=…&end=…`| same as free-busy-query |**non-standard extension**; same VFREEBUSY without XML |
67
72
|`GET`/`HEAD``.ics`|`GET`/`HEAD`, body passthrough |`text/calendar`, content-hash `ETag` header |
68
73
|`PUT``.ics`|`PUT` (auto-creates the container) | stores the VEVENT, returns content-hash `ETag`|
69
74
|`DELETE``.ics`|`DELETE`| 204 |
70
75
|`MKCALENDAR` / `MKCOL` / extended MKCOL |`PUT` to the trailing-slash URL | 201; host 409 "exists" → 405; body accepted but its props dropped |
0 commit comments