aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2026-03-30 00:05:31 +0200
committerrtkay123 <dev@kanjala.com>2026-03-30 00:05:31 +0200
commit2e2dc9707c15ed46290849e7e9ec41f012a18d51 (patch)
treedba84157da3b7fb6d9e6a5af1df0911b3b11452b
parent747a594a8010d6ba5dc97a583335aba2fb35392a (diff)
downloadwarden-2e2dc9707c15ed46290849e7e9ec41f012a18d51.tar.bz2
warden-2e2dc9707c15ed46290849e7e9ec41f012a18d51.zip
feat(schema): update schema
-rw-r--r--lib/api-config/src/schema/mod.rs50
-rw-r--r--warden/src/server/routes/config/logs.rs1
-rw-r--r--warden/src/server/routes/config/schema/create.rs6
-rw-r--r--warden/src/server/routes/config/schema/delete.rs17
-rw-r--r--warden/src/server/routes/config/schema/mod.rs1
-rw-r--r--warden/src/server/routes/config/schema/read.rs1
-rw-r--r--warden/src/server/routes/config/schema/update.rs76
-rw-r--r--warden/src/server/routes/transaction_monitoring/monitor.rs1
8 files changed, 129 insertions, 24 deletions
diff --git a/lib/api-config/src/schema/mod.rs b/lib/api-config/src/schema/mod.rs
index 33d7922..1fdbcef 100644
--- a/lib/api-config/src/schema/mod.rs
+++ b/lib/api-config/src/schema/mod.rs
@@ -46,6 +46,13 @@ pub trait SchemaDriver {
kind: impl AsRef<str> + Send + Sync,
version: impl AsRef<str> + Send + Sync,
) -> Result<Option<TransactionSchema>, ConfigurationError>;
+
+ async fn update_schema(
+ &self,
+ kind: impl AsRef<str> + Send + Sync,
+ version: impl AsRef<str> + Send + Sync,
+ schema: &serde_json::Value,
+ ) -> Result<TransactionSchema, ConfigurationError>;
}
#[async_trait]
@@ -98,12 +105,12 @@ impl SchemaDriver for AppState {
let result = sqlx::query_as!(
TransactionSchema,
"select
- type as kind,
- version,
- json_schema as schema,
- created_at,
- updated_at
- from transaction_schema where type = $1 and version = $2",
+ type as kind,
+ version,
+ json_schema as schema,
+ created_at,
+ updated_at
+ from transaction_schema where type = $1 and version = $2",
kind.as_ref(),
version.as_ref(),
)
@@ -112,4 +119,35 @@ impl SchemaDriver for AppState {
Ok(result)
}
+
+ async fn update_schema(
+ &self,
+ kind: impl AsRef<str> + Send + Sync,
+ version: impl AsRef<str> + Send + Sync,
+ schema: &serde_json::Value,
+ ) -> Result<TransactionSchema, crate::ConfigurationError> {
+ sqlx::query_as!(TransactionSchema,
+ "
+ update
+ transaction_schema
+ set
+ json_schema = $3
+ where
+ type = $1
+ and version = $2
+ returning
+ type as kind,
+ version,
+ json_schema as schema,
+ created_at,
+ updated_at
+ ",
+ kind.as_ref(),
+ version.as_ref(),
+ sqlx::types::Json(&schema) as _
+ )
+ .fetch_one(&self.database)
+ .await
+ .map_err(|e| e.into())
+ }
}
diff --git a/warden/src/server/routes/config/logs.rs b/warden/src/server/routes/config/logs.rs
index 1173603..6ed2736 100644
--- a/warden/src/server/routes/config/logs.rs
+++ b/warden/src/server/routes/config/logs.rs
@@ -12,6 +12,7 @@ pub struct LogLevel {
log_level: String,
}
+/// Update server's log level
#[utoipa::path(
patch,
responses(
diff --git a/warden/src/server/routes/config/schema/create.rs b/warden/src/server/routes/config/schema/create.rs
index 9bb3b22..1368bd6 100644
--- a/warden/src/server/routes/config/schema/create.rs
+++ b/warden/src/server/routes/config/schema/create.rs
@@ -7,13 +7,14 @@ use axum::{
http::{HeaderMap, StatusCode},
response::IntoResponse,
};
-use tracing::{debug, info, trace};
+use tracing::{info, trace};
use warden_core::state::AppState;
use crate::server::{api::version::Version, error::AppError, routes::config::CONFIG};
+/// Save a new transaction's schema
#[utoipa::path(
- put,
+ post,
responses(
(
status = 201,
@@ -101,6 +102,5 @@ pub async fn create_schema(
},
_ => e.into(),
})?;
- debug!("schema created");
Ok((StatusCode::CREATED, Json(result)))
}
diff --git a/warden/src/server/routes/config/schema/delete.rs b/warden/src/server/routes/config/schema/delete.rs
index 188f796..27df450 100644
--- a/warden/src/server/routes/config/schema/delete.rs
+++ b/warden/src/server/routes/config/schema/delete.rs
@@ -7,11 +7,11 @@ use axum::{
http::{HeaderMap, StatusCode},
response::IntoResponse,
};
-use tracing::debug;
use warden_core::state::AppState;
use crate::server::{api::version::Version, error::AppError, routes::config::CONFIG};
+/// Delete a transaction's schema
#[utoipa::path(
delete,
responses(
@@ -72,19 +72,6 @@ pub async fn delete_schema(
// TODO: should also clear cached ones eventually
state
.delete_schema(&body.kind, &body.version)
- .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 deleted");
+ .await?;
Ok(StatusCode::OK)
}
diff --git a/warden/src/server/routes/config/schema/mod.rs b/warden/src/server/routes/config/schema/mod.rs
index 1b4fcef..6ab66a1 100644
--- a/warden/src/server/routes/config/schema/mod.rs
+++ b/warden/src/server/routes/config/schema/mod.rs
@@ -13,5 +13,6 @@ pub fn router(store: Arc<AppState>) -> OpenApiRouter {
.routes(utoipa_axum::routes!(create::create_schema))
.routes(utoipa_axum::routes!(delete::delete_schema))
.routes(utoipa_axum::routes!(read::get_schema))
+ .routes(utoipa_axum::routes!(update::update_schema))
.with_state(store)
}
diff --git a/warden/src/server/routes/config/schema/read.rs b/warden/src/server/routes/config/schema/read.rs
index d4e09a7..0cdbac8 100644
--- a/warden/src/server/routes/config/schema/read.rs
+++ b/warden/src/server/routes/config/schema/read.rs
@@ -25,6 +25,7 @@ pub struct SchemaSearchQuery {
version: String,
}
+/// Get a transaction's schema
#[utoipa::path(
get,
responses(
diff --git a/warden/src/server/routes/config/schema/update.rs b/warden/src/server/routes/config/schema/update.rs
index 8b13789..a03e8e8 100644
--- a/warden/src/server/routes/config/schema/update.rs
+++ b/warden/src/server/routes/config/schema/update.rs
@@ -1 +1,77 @@
+use std::sync::Arc;
+use api_config::schema::{CreateSchema, SchemaDriver};
+use axum::{
+ Json, debug_handler,
+ extract::State,
+ http::{HeaderMap, StatusCode},
+ response::IntoResponse,
+};
+use warden_core::state::AppState;
+
+use crate::server::{api::version::Version, error::AppError, routes::config::CONFIG};
+
+/// Update a transaction's schema
+#[utoipa::path(
+ patch,
+ responses(
+ (
+ status = 200,
+ description = "The schema has been deleted",
+ headers(
+ ("x-request-id", description = "Request identifier")
+ )
+ ),
+ (
+ status = 400,
+ description = "Invalid request",
+ headers(
+ ("x-request-id", description = "Request identifier")
+ )
+ ),
+ (
+ status = 405,
+ description = "Method not allowed",
+ headers(
+ ("x-request-id", description = "Request identifier")
+ )
+ ),
+ (
+ status = 500,
+ description = "Internal server error",
+ headers(
+ ("x-request-id", description = "Request identifier")
+ )
+ )
+ ),
+ operation_id = "delete_schema", // https://github.com/juhaku/utoipa/issues/1170
+ tag = CONFIG,
+ request_body(
+ content = CreateSchema
+ ),
+ path = "/{version}/config/schema",
+ params(
+ ("version" = Version, Path, description = "API version, e.g., v1, v2, v3")
+ ),
+)]
+#[tracing::instrument(
+ name = "delete_schema",
+ skip(state, headers, body),
+ fields(
+ request_id = %headers.get("x-request-id")
+ .and_then(|v| v.to_str().ok()).expect("request id"),
+ kind = %body.kind,
+ )
+)]
+#[debug_handler]
+pub async fn update_schema(
+ State(state): State<Arc<AppState>>,
+ headers: HeaderMap,
+ Json(body): Json<CreateSchema>,
+) -> Result<impl IntoResponse, AppError> {
+ // TODO: should also clear cached ones eventually
+ state
+ .update_schema(&body.kind, &body.version, &body.schema)
+ .await?;
+ Ok(StatusCode::OK)
+}
diff --git a/warden/src/server/routes/transaction_monitoring/monitor.rs b/warden/src/server/routes/transaction_monitoring/monitor.rs
index 8fb51cd..0c60117 100644
--- a/warden/src/server/routes/transaction_monitoring/monitor.rs
+++ b/warden/src/server/routes/transaction_monitoring/monitor.rs
@@ -7,6 +7,7 @@ use crate::server::{
use axum::{extract::State, http::StatusCode};
use warden_core::state::AppState;
+/// Submit a transaction for monitoring
#[utoipa::path(
post,
responses(