diff options
| author | Matthew Fennell <matthew@fennell.dev> | 2026-04-16 08:15:35 +0100 |
|---|---|---|
| committer | Matthew Fennell <matthew@fennell.dev> | 2026-04-16 08:15:35 +0100 |
| commit | 5dce88bcad0a1263984b71fa19ef26393d781960 (patch) | |
| tree | cf3289fbedb56a7cb566a50b73788c8f44f64bc1 /records.scm | |
Initial commit
Diffstat (limited to 'records.scm')
| -rw-r--r-- | records.scm | 151 |
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>))) |
