summaryrefslogtreecommitdiff
path: root/records.scm
diff options
context:
space:
mode:
authorMatthew Fennell <matthew@fennell.dev>2026-04-16 08:15:35 +0100
committerMatthew Fennell <matthew@fennell.dev>2026-04-16 08:15:35 +0100
commit5dce88bcad0a1263984b71fa19ef26393d781960 (patch)
treecf3289fbedb56a7cb566a50b73788c8f44f64bc1 /records.scm
Initial commit
Diffstat (limited to 'records.scm')
-rw-r--r--records.scm151
1 files changed, 151 insertions, 0 deletions
diff --git a/records.scm b/records.scm
new file mode 100644
index 0000000..cff328f
--- /dev/null
+++ b/records.scm
@@ -0,0 +1,151 @@
+;;; SPDX-FileCopyrightText: 2026 Matthew Fennell <matthew@fennell.dev>
+;;;
+;;; SPDX-License-Identifier: AGPL-3.0-or-later
+
+(use-modules (ice-9 string-fun)
+ (json)
+ (srfi srfi-9)
+ (srfi srfi-26))
+
+(define-record-type <booking>
+ (make-booking venue activity start end)
+ booking?
+ (venue booking-venue)
+ (activity booking-activity)
+ (start booking-start)
+ (end booking-end))
+
+(set-record-type-printer! <booking>
+ (lambda (booking port)
+ (let* ((date-str ((compose date->api-string booking-start) booking))
+ (start-str ((compose time->api-string booking-start) booking))
+ (end-str ((compose time->api-string booking-end) booking))
+ (venue (booking-venue booking))
+ (activity (booking-activity booking)))
+ (for-each
+ (lambda (obj) (display obj port))
+ `(,activity "@" ,venue "@" ,date-str "T" ,start-str "-" ,end-str)))))
+
+(define (time-data->booking time)
+ (let* ((date-str-format "~Y-~m-~d ~H:~M")
+ (start-str (string-append (time-data-date time)
+ " "
+ ((compose at-time time-data-start) time)))
+ (end-str (string-append (time-data-date time)
+ " "
+ ((compose at-time time-data-end) time)))
+ (venue ((compose string->symbol time-data-venue) time))
+ (activity ((compose string->symbol time-data-activity) time))
+ (start (string->date start-str date-str-format))
+ (end (string->date end-str date-str-format)))
+ (make-booking venue activity start end)))
+
+(define (activity-name->activity-slug name)
+ (let ((string-replace-substring (lambda (from to str) (string-replace-substring str from to))))
+ ((compose string-downcase (cut string-replace-substring " " "-" <>)) name)))
+
+(define (bookings-response-data->booking data)
+ (let* ((date-str-format "~Y-~m-~d ~H:~M")
+ (date-str ((compose booking-date-raw booking-item-date bookings-response-data-item) data))
+ (start-str (string-append date-str
+ " "
+ ((compose at-time booking-item-start bookings-response-data-item) data)))
+ (end-str (string-append date-str
+ " "
+ ((compose at-time booking-item-end bookings-response-data-item) data)))
+ (venue ((compose string->symbol booking-location-venue booking-item-location bookings-response-data-item) data))
+ (activity ((compose string->symbol activity-name->activity-slug bookings-response-data-category) data))
+ (start (string->date start-str date-str-format))
+ (end (string->date end-str date-str-format)))
+ (make-booking venue activity start end)))
+
+(define-json-type <login-request>
+ (username)
+ (password))
+
+(define-json-type <login-response>
+ (token))
+
+(define-json-type <at>
+ (time "format_24_hour"))
+
+(define-json-type <time-data>
+ (venue "venue_slug")
+ (activity "category_slug")
+ (date)
+ (start "starts_at" <at>)
+ (end "ends_at" <at>)
+ (key "composite_key")
+ (spaces))
+
+(define-json-type <time-response>
+ (data "data" #(<time-data>)))
+
+(define-json-type <slot>
+ (id)
+ (restriction-ids "restriction_ids")
+ (pricing-option-id "pricing_option_id")
+ (type "cart_type")
+ (spaces))
+
+(define-json-type <slots-response>
+ (data "data" #(<slot>)))
+
+(define-json-type <add-item>
+ (id)
+ (type))
+
+(define-json-type <add-request>
+ (items "items" #(<add-item>)))
+
+(define-json-type <cart>
+ (total)
+ (item-hash "itemHash"))
+
+(define-json-type <cart-response>
+ (data "data" <cart>))
+
+(define-json-type <credits-to-reserve>
+ (amount)
+ (type))
+
+(define-json-type <apply-credits-request>
+ (cart-source "cart_source")
+ (credits-to-reserve "credits_to_reserve" #(<credits-to-reserve>))
+ (selected-user-id "selected_user_id"))
+
+(define-json-type <error-response>
+ (message))
+
+(define-json-type <payment>
+ (tender-type "tender_type")
+ (amount)
+ (info))
+
+(define-json-type <complete-request>
+ (completed-waivers "completed_waivers")
+ (payments "payments" #(<payment>))
+ (selected-user-id "selected_user_id")
+ (source)
+ (terms)
+ (item-hash "item_hash"))
+
+(define-json-type <booking-date>
+ (raw))
+
+(define-json-type <booking-location>
+ (name)
+ (venue "venue_slug"))
+
+(define-json-type <booking-item>
+ (date "date" <booking-date>)
+ (start "starts_at" <at>)
+ (end "ends_at" <at>)
+ (location "location" <booking-location>))
+
+(define-json-type <bookings-response-data>
+ (item "item" <booking-item>)
+ (category))
+
+(define-json-type <bookings-response>
+ (data "data" #(<bookings-response-data>)))