diff options
| author | Marius Peter <dev@marius-peter.com> | 2025-10-23 17:08:04 +0200 | 
|---|---|---|
| committer | Marius Peter <dev@marius-peter.com> | 2025-10-23 17:08:04 +0200 | 
| commit | d7a96109d779acd25259d966ccfda05b5a154815 (patch) | |
| tree | 0318c0c2c32e0624dd6fe6f950b9c47415553655 /models | |
| parent | 8da8e41420307810f855f0596ca4bb67d23afa0f (diff) | |
Enforce creation idempotency at the model level.
Diffstat (limited to 'models')
| -rw-r--r-- | models/nutrient-measurement.rkt | 51 | 
1 files changed, 26 insertions, 25 deletions
diff --git a/models/nutrient-measurement.rkt b/models/nutrient-measurement.rkt index 7ccc7f3..3b997c8 100644 --- a/models/nutrient-measurement.rkt +++ b/models/nutrient-measurement.rkt @@ -37,31 +37,32 @@  ;; CREATE  (define (create-nutrient-measurement! measured-on nutrient-values) -  (with-tx -    (query-exec (current-conn) -                (insert #:into nutrient_measurements -                        #:set [measured_on ,measured-on])) -    (define nm-id (query-value (current-conn) -                               (select id -                                       #:from nutrient_measurements -                                       #:where (= measured_on ,measured-on)))) -    (query-exec (current-conn) -                (insert #:into nutrient_value_sets -                        #:set [nutrient_measurement_id ,nm-id])) -    (define nvs-id (query-value (current-conn) -                                (select id -                                        #:from nutrient_value_sets -                                        #:where (= nutrient_measurement_id ,nm-id)))) -    (for ([nv nutrient-values]) -      (match nv -        [(cons n v) -         (query-exec (current-conn) -                     (insert #:into nutrient_values -                             #:set -                             [value_set_id ,nvs-id] -                             [nutrient_id  ,(nutrient-id n)] -                             [value_ppm    ,v]))])) -    (get-nutrient-measurement #:measured-on measured-on))) +  (or (get-nutrient-measurement #:measured-on measured-on) +      (with-tx +        (query-exec (current-conn) +                    (insert #:into nutrient_measurements +                            #:set [measured_on ,measured-on])) +        (define nm-id (query-value (current-conn) +                                   (select id +                                           #:from nutrient_measurements +                                           #:where (= measured_on ,measured-on)))) +        (query-exec (current-conn) +                    (insert #:into nutrient_value_sets +                            #:set [nutrient_measurement_id ,nm-id])) +        (define nvs-id (query-value (current-conn) +                                    (select id +                                            #:from nutrient_value_sets +                                            #:where (= nutrient_measurement_id ,nm-id)))) +        (for ([nv nutrient-values]) +          (match nv +            [(cons n v) +             (query-exec (current-conn) +                         (insert #:into nutrient_values +                                 #:set +                                 [value_set_id ,nvs-id] +                                 [nutrient_id  ,(nutrient-id n)] +                                 [value_ppm    ,v]))])) +        (get-nutrient-measurement #:measured-on measured-on))))  ;; READ  |