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 | |
| parent | 8da8e41420307810f855f0596ca4bb67d23afa0f (diff) | |
Enforce creation idempotency at the model level.
| -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 |