summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Peter <dev@marius-peter.com>2025-10-23 17:08:04 +0200
committerMarius Peter <dev@marius-peter.com>2025-10-23 17:08:04 +0200
commitd7a96109d779acd25259d966ccfda05b5a154815 (patch)
tree0318c0c2c32e0624dd6fe6f950b9c47415553655
parent8da8e41420307810f855f0596ca4bb67d23afa0f (diff)
Enforce creation idempotency at the model level.
-rw-r--r--models/nutrient-measurement.rkt51
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
Copyright 2019--2025 Marius PETER