aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2026-03-29 16:51:09 +0200
committerrtkay123 <dev@kanjala.com>2026-03-29 16:51:09 +0200
commit3fb3d0214a69017d49c91aa180fb565533edcc54 (patch)
treec3618666a7e7c5cbe0f0a4bbf379cc82e4f82e3f
parentff3b9fbaf400c344cae67ef9bdc9ba7d5f27b976 (diff)
downloadwarden-3fb3d0214a69017d49c91aa180fb565533edcc54.tar.bz2
warden-3fb3d0214a69017d49c91aa180fb565533edcc54.zip
refactor: use api-config to create schema
-rw-r--r--Cargo.lock12
-rw-r--r--lib/api-config/Cargo.toml1
-rw-r--r--lib/api-config/src/error.rs4
-rw-r--r--lib/api-config/src/schema/create.rs32
-rw-r--r--lib/api-config/src/schema/mod.rs12
-rw-r--r--warden/src/server/routes/config/schema/create.rs39
6 files changed, 70 insertions, 30 deletions
diff --git a/Cargo.lock b/Cargo.lock
index a5fadec..821fe2a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -97,6 +97,7 @@ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
name = "api-config"
version = "0.1.0"
dependencies = [
+ "async-trait",
"serde",
"serde_json",
"sqlx",
@@ -117,6 +118,17 @@ dependencies = [
]
[[package]]
+name = "async-trait"
+version = "0.1.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
name = "atoi"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/lib/api-config/Cargo.toml b/lib/api-config/Cargo.toml
index ec31262..b114944 100644
--- a/lib/api-config/Cargo.toml
+++ b/lib/api-config/Cargo.toml
@@ -9,6 +9,7 @@ homepage.workspace = true
publish.workspace = true
[dependencies]
+async-trait.workspace = true
serde.workspace = true
serde_json.workspace = true
thiserror.workspace = true
diff --git a/lib/api-config/src/error.rs b/lib/api-config/src/error.rs
index 6f7b099..b2dc9ad 100644
--- a/lib/api-config/src/error.rs
+++ b/lib/api-config/src/error.rs
@@ -2,8 +2,8 @@ use thiserror::Error;
#[derive(Error, Debug)]
pub enum ConfigurationError {
- #[error("data store disconnected")]
- Disconnect(#[from] sqlx::Error),
+ #[error(transparent)]
+ Database(#[from] sqlx::Error),
#[error("the data for key `{0}` is not available")]
Redaction(String),
#[error("invalid header (expected {expected:?}, found {found:?})")]
diff --git a/lib/api-config/src/schema/create.rs b/lib/api-config/src/schema/create.rs
index 5c91f64..de2d214 100644
--- a/lib/api-config/src/schema/create.rs
+++ b/lib/api-config/src/schema/create.rs
@@ -1,4 +1,8 @@
+use async_trait::async_trait;
use serde::{Deserialize, Serialize};
+use warden_core::state::AppState;
+
+use crate::schema::{SchemaDriver, TransactionSchema};
#[derive(Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
@@ -13,3 +17,31 @@ pub struct CreateSchema {
#[serde(rename = "json_schema")]
pub schema: serde_json::Value,
}
+
+#[async_trait]
+impl SchemaDriver for AppState {
+ async fn create_schema(
+ &self,
+ name: impl AsRef<str> + Send + Sync,
+ version: impl AsRef<str> + Send + Sync,
+ schema: &serde_json::Value,
+ ) -> Result<super::TransactionSchema, crate::ConfigurationError> {
+ sqlx::query_as!(
+ TransactionSchema,
+ "insert into transaction_schema (type, version, json_schema) values ($1, $2, $3)
+ returning
+ type as kind,
+ version,
+ json_schema as schema,
+ created_at,
+ updated_at
+ ",
+ name.as_ref(),
+ version.as_ref(),
+ sqlx::types::Json(&schema) as _
+ )
+ .fetch_one(&self.database)
+ .await
+ .map_err(|e| e.into())
+ }
+}
diff --git a/lib/api-config/src/schema/mod.rs b/lib/api-config/src/schema/mod.rs
index 654e6ad..3893254 100644
--- a/lib/api-config/src/schema/mod.rs
+++ b/lib/api-config/src/schema/mod.rs
@@ -1,5 +1,6 @@
pub mod create;
+use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
@@ -23,11 +24,12 @@ pub struct TransactionSchema {
pub updated_at: OffsetDateTime,
}
+#[async_trait]
pub trait SchemaDriver {
- fn create(
+ async fn create_schema(
&self,
- name: impl AsRef<str>,
- version: impl AsRef<str>,
- schema: serde_json::Value,
- ) -> impl std::future::Future<Output = Result<TransactionSchema, ConfigurationError>> + Send + Sync;
+ name: impl AsRef<str> + Send + Sync,
+ version: impl AsRef<str> + Send + Sync,
+ schema: &serde_json::Value,
+ ) -> Result<TransactionSchema, ConfigurationError>;
}
diff --git a/warden/src/server/routes/config/schema/create.rs b/warden/src/server/routes/config/schema/create.rs
index d655a2b..6a71720 100644
--- a/warden/src/server/routes/config/schema/create.rs
+++ b/warden/src/server/routes/config/schema/create.rs
@@ -1,5 +1,6 @@
use std::sync::Arc;
+use api_config::schema::SchemaDriver;
use axum::{
Json, debug_handler,
extract::State,
@@ -92,29 +93,21 @@ pub async fn create_schema(
})?;
info!("schema is valid. trying to save...");
- let result = sqlx::query_as!(
- TransactionSchema,
- "insert into transaction_schema (type, version, json_schema) values ($1, $2, $3)
- returning
- type as kind,
- version,
- json_schema as schema,
- created_at,
- updated_at
- ",
- body.kind,
- body.version,
- sqlx::types::Json(&body.schema) as _
- )
- .fetch_one(&state.database)
- .await
- .map_err(|e| match e {
- sqlx::Error::Database(db_err) if db_err.code() == Some("23505".into()) => AppError::new(
- StatusCode::CONFLICT,
- anyhow::anyhow!("Transaction schema already exists"),
- ),
- _ => e.into(),
- })?;
+ let result = state
+ .create_schema(&body.kind, &body.version, &body.schema)
+ .await
+ .map_err(|e| match e {
+ api_config::ConfigurationError::Database(ref error) => match error {
+ sqlx::Error::Database(db_err) if db_err.code() == Some("23505".into()) => {
+ AppError::new(
+ StatusCode::CONFLICT,
+ anyhow::anyhow!("Transaction schema already exists"),
+ )
+ }
+ _ => e.into(),
+ },
+ _ => e.into(),
+ })?;
debug!("schema created");
Ok((StatusCode::CREATED, Json(result)))
}