diff options
| author | rtkay123 <dev@kanjala.com> | 2026-03-30 00:05:31 +0200 |
|---|---|---|
| committer | rtkay123 <dev@kanjala.com> | 2026-03-30 00:05:31 +0200 |
| commit | 2e2dc9707c15ed46290849e7e9ec41f012a18d51 (patch) | |
| tree | dba84157da3b7fb6d9e6a5af1df0911b3b11452b | |
| parent | 747a594a8010d6ba5dc97a583335aba2fb35392a (diff) | |
| download | warden-2e2dc9707c15ed46290849e7e9ec41f012a18d51.tar.bz2 warden-2e2dc9707c15ed46290849e7e9ec41f012a18d51.zip | |
feat(schema): update schema
| -rw-r--r-- | lib/api-config/src/schema/mod.rs | 50 | ||||
| -rw-r--r-- | warden/src/server/routes/config/logs.rs | 1 | ||||
| -rw-r--r-- | warden/src/server/routes/config/schema/create.rs | 6 | ||||
| -rw-r--r-- | warden/src/server/routes/config/schema/delete.rs | 17 | ||||
| -rw-r--r-- | warden/src/server/routes/config/schema/mod.rs | 1 | ||||
| -rw-r--r-- | warden/src/server/routes/config/schema/read.rs | 1 | ||||
| -rw-r--r-- | warden/src/server/routes/config/schema/update.rs | 76 | ||||
| -rw-r--r-- | warden/src/server/routes/transaction_monitoring/monitor.rs | 1 |
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( |
