diff options
| author | Marius Peter <dev@marius-peter.com> | 2025-11-29 18:10:26 +0100 |
|---|---|---|
| committer | Marius Peter <dev@marius-peter.com> | 2025-11-29 18:10:26 +0100 |
| commit | a3e00cb41614056b898d74bafe0f86afb2590c56 (patch) | |
| tree | 9920bcf87797ac7e7fe1dc51316ca4103af7511c /models/nutrient-measurement.rkt | |
| parent | dafe1aaa54d41999b4c81f4904ae1f0e7cc9de11 (diff) | |
Main model structs can now be manipulated by id or entire struct.
This paves the way to passing ids in URLs, and acting upon them in
handlers.
Diffstat (limited to 'models/nutrient-measurement.rkt')
| -rw-r--r-- | models/nutrient-measurement.rkt | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/models/nutrient-measurement.rkt b/models/nutrient-measurement.rkt index 913e402..b4baba6 100644 --- a/models/nutrient-measurement.rkt +++ b/models/nutrient-measurement.rkt @@ -12,11 +12,11 @@ (->* () (#:id (or/c #f exact-nonnegative-integer?) #:measured-on (or/c #f string?)) (or/c nutrient-measurement? #f))] - [get-nutrient-measurement-values (-> nutrient-measurement? nutrient-value-hash/c)] - [get-nutrient-measurement-value (-> nutrient-measurement? nutrient? (or/c number? #f))] - [get-latest-nutrient-measurement-value (-> nutrient? (or/c number? #f))] + [get-nutrient-measurement-values (-> nutrient-measurement-or-id/c nutrient-value-hash/c)] + [get-nutrient-measurement-value (-> nutrient-measurement-or-id/c nutrient? (or/c real? #f))] + [get-latest-nutrient-measurement-value (-> nutrient? (or/c real? #f))] [get-latest-nutrient-measurement-hash (-> nutrient-value-hash/c)] - [delete-nutrient-measurement! (-> nutrient-measurement? void?)])) + [delete-nutrient-measurement! (-> nutrient-measurement-or-id/c void?)])) (require racket/contract db @@ -38,6 +38,15 @@ (~a (nutrient-canonical-name n) #:min-width 14) (~a v #:max-width 6 #:align 'right))))) +(define nutrient-measurement-id? exact-nonnegative-integer?) + +(define nutrient-measurement-or-id/c (or/c nutrient-measurement? nutrient-measurement-id?)) + +(define (->nm-id nm-or-id) + (match nm-or-id + [(? nutrient-measurement-id? id) id] + [(nutrient-measurement id _ _) id])) + ;; CREATE (define (create-nutrient-measurement! measured-on nutrient-values) @@ -120,7 +129,7 @@ [(list row) (grouped-row->nutrient-measurement row)] [many (error 'get-nutrient-measurement "expected 1 nutrient measurement, got ~a" (length many))])) -(define (get-nutrient-measurement-values nutrient-measurement) +(define (get-nutrient-measurement-values nm-or-id) (for/hash ([(nutrient-id canonical-name french-name formula value_ppm) (in-query (current-conn) (select n.id @@ -129,14 +138,14 @@ n.formula nv.value_ppm #:from (TableExpr:AST ,joined) - #:where (= nm.id ,(nutrient-measurement-id nutrient-measurement))))]) + #:where (= nm.id ,(->nm-id nm-or-id))))]) (values (nutrient nutrient-id canonical-name french-name formula) value_ppm))) -(define (get-nutrient-measurement-value nutrient-measurement nutrient) +(define (get-nutrient-measurement-value nm-or-id nutrient) (query-maybe-value (current-conn) (select value_ppm #:from (TableExpr:AST ,joined) - #:where (and (= nm.id ,(nutrient-measurement-id nutrient-measurement)) + #:where (and (= nm.id ,(->nm-id nm-or-id)) (= nv.nutrient_id ,(nutrient-id nutrient)))))) (define (get-latest-nutrient-measurement-value nutrient) @@ -171,9 +180,9 @@ ;; DELETE -(define (delete-nutrient-measurement! nutrient-measurement) - (define id (nutrient-measurement-id nutrient-measurement)) - (query-exec (current-conn) (delete #:from nutrient_measurements #:where (= id ,id)))) +(define (delete-nutrient-measurement! nm-or-id) + (query-exec (current-conn) + (delete #:from nutrient_measurements #:where (= id ,(->nm-id nm-or-id))))) (module+ test (require rackunit |