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-target.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-target.rkt')
| -rw-r--r-- | models/nutrient-target.rkt | 73 |
1 files changed, 42 insertions, 31 deletions
diff --git a/models/nutrient-target.rkt b/models/nutrient-target.rkt index cffa657..10c0c42 100644 --- a/models/nutrient-target.rkt +++ b/models/nutrient-target.rkt @@ -5,18 +5,18 @@ nutrient-target-id (rename-out [nutrient-target-effective-on nutrient-target-date] [nutrient-target-nutrient-values nutrient-target-values]) - (contract-out [create-nutrient-target! (-> string? nutrient-value-hash/c nutrient-target?)] - [get-nutrient-targets (-> (listof nutrient-target?))] - [get-nutrient-target - (->* () - (#:id (or/c #f exact-nonnegative-integer?) - #:effective-on (or/c #f string?)) - (or/c nutrient-target? #f))] - [get-nutrient-target-values (-> nutrient-target? nutrient-value-hash/c)] - [get-nutrient-target-value (-> nutrient-target? nutrient? (or/c number? #f))] - [get-latest-nutrient-target-value (-> nutrient? (or/c number? #f))] - [get-latest-nutrient-target-hash (-> nutrient-value-hash/c)] - [delete-nutrient-target! (-> nutrient-target? void?)])) + (contract-out + [create-nutrient-target! (-> string? nutrient-value-hash/c nutrient-target?)] + [get-nutrient-targets (-> (listof nutrient-target?))] + [get-nutrient-target + (->* () + (#:id (or/c #f exact-nonnegative-integer?) #:effective-on (or/c #f string?)) + (or/c nutrient-target? #f))] + [get-nutrient-target-values (-> nutrient-target-or-id/c nutrient-value-hash/c)] + [get-nutrient-target-value (-> nutrient-target-or-id/c nutrient? (or/c number? #f))] + [get-latest-nutrient-target-value (-> nutrient? (or/c number? #f))] + [get-latest-nutrient-target-hash (-> nutrient-value-hash/c)] + [delete-nutrient-target! (-> nutrient-target-or-id/c void?)])) (require racket/contract db @@ -35,6 +35,15 @@ (~a (nutrient-canonical-name n) #:min-width 14) (~a v #:max-width 6 #:align 'right))))) +(define nutrient-target-id? exact-nonnegative-integer?) + +(define nutrient-target-or-id/c (or/c nutrient-target? nutrient-target-id?)) + +(define (->nt-id nt-or-id) + (match nt-or-id + [(? nutrient-target-id? id) id] + [(nutrient-target id _ _) id])) + ;; CREATE (define (create-nutrient-target! effective-on nutrient-values) @@ -73,19 +82,21 @@ (nutrient-target nt-id effective-on (residuals->nutrient-value-hash residuals))) (define (get-nutrient-targets) - (for/list ([grouped-row (in-query (current-conn) - (select nt.id - nt.effective_on - n.id - n.canonical_name - n.french_name - n.formula - nv.value_ppm - #:from (TableExpr:AST ,joined) - #:order-by nt.effective_on - #:desc) - #:group '#(0 1))]) - (grouped-row->nutrient-target grouped-row))) + (define grouped-rows + (query-rows (current-conn) + (select nt.id + nt.effective_on + n.id + n.canonical_name + n.french_name + n.formula + nv.value_ppm + #:from (TableExpr:AST ,joined) + #:order-by nt.effective_on + #:desc) + #:group '#(0 1))) + (for/list ([row grouped-rows]) + (grouped-row->nutrient-target row))) (define (get-nutrient-target #:id [nt-id #f] #:effective-on [effective-on #f]) (define where @@ -114,7 +125,7 @@ [(list row) (grouped-row->nutrient-target row)] [many (error 'get-nutrient-target "expected 1 nutrient target, got ~a" (length many))])) -(define (get-nutrient-target-values nutrient-target) +(define (get-nutrient-target-values nt-or-id) (for/hash ([(nutrient-id canonical-name french-name formula value_ppm) (in-query (current-conn) (select n.id @@ -123,14 +134,14 @@ n.formula nv.value_ppm #:from (TableExpr:AST ,joined) - #:where (= nt.id ,(nutrient-target-id nutrient-target))))]) + #:where (= nt.id ,(->nt-id nt-or-id))))]) (values (nutrient nutrient-id canonical-name french-name formula) value_ppm))) -(define (get-nutrient-target-value nutrient-target nutrient) +(define (get-nutrient-target-value nt-or-id nutrient) (query-maybe-value (current-conn) (select value_ppm #:from (TableExpr:AST ,joined) - #:where (and (= nt.id ,(nutrient-target-id nutrient-target)) + #:where (and (= nt.id ,(->nt-id nt-or-id)) (= nv.nutrient_id ,(nutrient-id nutrient)))))) (define (get-latest-nutrient-target-value nutrient) @@ -165,6 +176,6 @@ ;; DELETE -(define (delete-nutrient-target! nutrient-target) +(define (delete-nutrient-target! nt-or-id) (define id (nutrient-target-id nutrient-target)) - (query-exec (current-conn) (delete #:from nutrient_targets #:where (= id ,id)))) + (query-exec (current-conn) (delete #:from nutrient_targets #:where (= id ,(->nt-id nt-or-id))))) |