about summary refs log tree commit diff stats
path: root/crates/rocie-server/src/storage/sql/insert
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2026-03-19 02:42:02 +0100
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2026-03-19 02:42:02 +0100
commit6df299c87ba8faab75626d04392f874ec642c8dc (patch)
tree64744ae2dea2c726d72589ce290e88679e60c564 /crates/rocie-server/src/storage/sql/insert
parentchore(rocie-client): Re-generate the client api (diff)
downloadserver-6df299c87ba8faab75626d04392f874ec642c8dc.zip
feat(rocie-server): Provide default units (and other changes)
Diffstat (limited to 'crates/rocie-server/src/storage/sql/insert')
-rw-r--r--crates/rocie-server/src/storage/sql/insert/config/mod.rs80
-rw-r--r--crates/rocie-server/src/storage/sql/insert/mod.rs1
2 files changed, 81 insertions, 0 deletions
diff --git a/crates/rocie-server/src/storage/sql/insert/config/mod.rs b/crates/rocie-server/src/storage/sql/insert/config/mod.rs
new file mode 100644
index 0000000..8c81feb
--- /dev/null
+++ b/crates/rocie-server/src/storage/sql/insert/config/mod.rs
@@ -0,0 +1,80 @@
+use serde::{Deserialize, Serialize};
+use sqlx::query;
+
+use crate::storage::sql::{
+    config::Config,
+    insert::{Operations, Transactionable},
+};
+
+#[derive(Debug, Deserialize, Serialize)]
+pub(crate) enum Operation {
+    UseDefault { value: bool, old_value: bool },
+}
+
+impl Transactionable for Operation {
+    type ApplyError = apply::Error;
+    type UndoError = undo::Error;
+
+    async fn apply(self, txn: &mut sqlx::SqliteConnection) -> Result<(), apply::Error> {
+        match self {
+            Operation::UseDefault { value, .. } => {
+                query!(
+                    "
+                   UPDATE config
+                   SET use_defaults = ?
+                   WHERE id = 0
+",
+                    value,
+                )
+                .execute(txn)
+                .await?;
+            }
+        }
+        Ok(())
+    }
+
+    async fn undo(self, txn: &mut sqlx::SqliteConnection) -> Result<(), undo::Error> {
+        match self {
+            Operation::UseDefault { old_value, .. } => {
+                query!(
+                    "
+                   UPDATE config
+                   SET use_defaults = ?
+                   WHERE id = 0
+",
+                    old_value,
+                )
+                .execute(txn)
+                .await?;
+            }
+        }
+        Ok(())
+    }
+}
+
+pub(crate) mod undo {
+    #[derive(thiserror::Error, Debug)]
+    pub(crate) enum Error {
+        #[error("Failed to execute undo sql statments: {0}")]
+        SqlError(#[from] sqlx::Error),
+    }
+}
+pub(crate) mod apply {
+    #[derive(thiserror::Error, Debug)]
+    pub(crate) enum Error {
+        #[error("Failed to execute apply sql statments: {0}")]
+        SqlError(#[from] sqlx::Error),
+    }
+}
+
+impl Config {
+    pub(crate) fn set_use_default(&mut self, new_value: bool, ops: &mut Operations<Operation>) {
+        if self.should_use_defaults != new_value {
+            ops.push(Operation::UseDefault {
+                value: new_value,
+                old_value: self.should_use_defaults,
+            });
+            self.should_use_defaults = new_value;
+        }
+    }
+}
diff --git a/crates/rocie-server/src/storage/sql/insert/mod.rs b/crates/rocie-server/src/storage/sql/insert/mod.rs
index b92a88c..c106b2b 100644
--- a/crates/rocie-server/src/storage/sql/insert/mod.rs
+++ b/crates/rocie-server/src/storage/sql/insert/mod.rs
@@ -8,6 +8,7 @@ use serde::{Serialize, de::DeserializeOwned};
 use sqlx::{SqliteConnection, query};
 
 pub(crate) mod barcode;
+pub(crate) mod config;
 pub(crate) mod product;
 pub(crate) mod product_parent;
 pub(crate) mod recipe;