events: whole-series booking + 9 tests
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 59s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 59s
ev/book-series! / ev/cancel-series! apply a booking/cancel to every occurrence of one event in a window (RSVP the whole weekly class), returning per- occurrence (occ-key status) results; capacity still enforced per occurrence (some :booked, some :full), idempotent re-book (:already). ev/series-count, ev/series-booked. 341/341 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -275,3 +275,55 @@
|
||||
((ev/would-time-conflict? b store actor occ)
|
||||
{:status :time-conflict :actor actor :occ-key (ev-occ-key occ)})
|
||||
(else (ev/book-occ! b store actor occ)))))
|
||||
|
||||
;; ---- whole-series operations ----
|
||||
;; Apply a booking action to every occurrence of one event in [ws, we) — e.g.
|
||||
;; "RSVP to the whole weekly class". Returns a list of (occ-key status) results,
|
||||
;; one per occurrence (empty if the event id is unknown).
|
||||
(define
|
||||
ev/book-series!
|
||||
(fn
|
||||
(b store actor event-id ws we)
|
||||
(let
|
||||
((ev (ev/event-by-id store event-id)))
|
||||
(if
|
||||
(nil? ev)
|
||||
(list)
|
||||
(map
|
||||
(fn (occ) (list (ev-occ-key occ) (get (ev/book-occ! b store actor occ) :status)))
|
||||
(ev-expand ev ws we))))))
|
||||
|
||||
;; Cancel `actor` from every occurrence of one event in [ws, we).
|
||||
(define
|
||||
ev/cancel-series!
|
||||
(fn
|
||||
(b store actor event-id ws we)
|
||||
(let
|
||||
((ev (ev/event-by-id store event-id)))
|
||||
(if
|
||||
(nil? ev)
|
||||
(list)
|
||||
(map
|
||||
(fn (occ) (list (ev-occ-key occ) (get (ev/cancel! b (ev-occ-key occ) actor) :status)))
|
||||
(ev-expand ev ws we))))))
|
||||
|
||||
;; How many statuses in a series-result list equal `status`.
|
||||
(define
|
||||
ev/series-count
|
||||
(fn
|
||||
(results status)
|
||||
(len (filter (fn (r) (= (first (rest r)) status)) results))))
|
||||
|
||||
;; The occurrences of one event in [ws, we) that `actor` is booked into.
|
||||
(define
|
||||
ev/series-booked
|
||||
(fn
|
||||
(b store actor event-id ws we)
|
||||
(let
|
||||
((ev (ev/event-by-id store event-id)))
|
||||
(if
|
||||
(nil? ev)
|
||||
(list)
|
||||
(filter
|
||||
(fn (occ) (ev-actor-booked? b (ev-occ-key occ) actor))
|
||||
(ev-expand ev ws we))))))
|
||||
|
||||
Reference in New Issue
Block a user