diff options
| author | rtkay123 <dev@kanjala.com> | 2026-03-29 17:11:27 +0200 |
|---|---|---|
| committer | rtkay123 <dev@kanjala.com> | 2026-03-29 17:11:27 +0200 |
| commit | 2b4d2fab25963712900dda4736432a64189fa876 (patch) | |
| tree | ed1e72141d3ebd7325fd4f44b59e71431f20d7c4 | |
| parent | 3fb3d0214a69017d49c91aa180fb565533edcc54 (diff) | |
| download | warden-2b4d2fab25963712900dda4736432a64189fa876.tar.bz2 warden-2b4d2fab25963712900dda4736432a64189fa876.zip | |
feat: delete transaction schema
| -rw-r--r-- | lib/api-config/src/schema/create.rs | 32 | ||||
| -rw-r--r-- | lib/api-config/src/schema/mod.rs | 55 | ||||
| -rw-r--r-- | lib/warden-core/Cargo.toml | 2 | ||||
| -rw-r--r-- | warden/src/server/api/mod.rs | 1 | ||||
| -rw-r--r-- | warden/src/server/api/schema.rs | 33 | ||||
| -rw-r--r-- | warden/src/server/routes/config/mod.rs | 1 | ||||
| -rw-r--r-- | warden/src/server/routes/config/schema/create.rs | 3 | ||||
| -rw-r--r-- | warden/src/server/routes/config/schema/delete.rs | 96 |
8 files changed, 152 insertions, 71 deletions
diff --git a/lib/api-config/src/schema/create.rs b/lib/api-config/src/schema/create.rs index de2d214..5c91f64 100644 --- a/lib/api-config/src/schema/create.rs +++ b/lib/api-config/src/schema/create.rs @@ -1,8 +1,4 @@ -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))] @@ -17,31 +13,3 @@ 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 3893254..b058060 100644 --- a/lib/api-config/src/schema/mod.rs +++ b/lib/api-config/src/schema/mod.rs @@ -1,8 +1,10 @@ -pub mod create; +mod create; +pub use create::CreateSchema; use async_trait::async_trait; use serde::{Deserialize, Serialize}; use time::OffsetDateTime; +use warden_core::state::AppState; use crate::ConfigurationError; @@ -28,8 +30,57 @@ pub struct TransactionSchema { pub trait SchemaDriver { async fn create_schema( &self, - name: impl AsRef<str> + Send + Sync, + kind: impl AsRef<str> + Send + Sync, version: impl AsRef<str> + Send + Sync, schema: &serde_json::Value, ) -> Result<TransactionSchema, ConfigurationError>; + + async fn delete_schema( + &self, + kind: impl AsRef<str> + Send + Sync, + version: impl AsRef<str> + Send + Sync, + ) -> Result<(), ConfigurationError>; +} + +#[async_trait] +impl SchemaDriver for AppState { + async fn create_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, + "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 + ", + kind.as_ref(), + version.as_ref(), + sqlx::types::Json(&schema) as _ + ) + .fetch_one(&self.database) + .await + .map_err(|e| e.into()) + } + + async fn delete_schema( + &self, + kind: impl AsRef<str> + Send + Sync, + version: impl AsRef<str> + Send + Sync, + ) -> Result<(), crate::ConfigurationError> { + // sqlx::query!("delete * from transaction_schema where type = $1 and version $2", + // name.as_ref(), + // version.as_ref(), + // ) + // .execute(&self.database) + // .await + // .map_err(|e| e.into()) + Ok(()) + } } diff --git a/lib/warden-core/Cargo.toml b/lib/warden-core/Cargo.toml index 1f92e87..49b7186 100644 --- a/lib/warden-core/Cargo.toml +++ b/lib/warden-core/Cargo.toml @@ -14,7 +14,7 @@ serde = { workspace = true, features = ["derive"] } thiserror.workspace = true tracing.workspace = true tracing-subscriber = { version = "0.3.23", features = ["env-filter"] } -url.workspace = true +url = { workspace = true, features = ["serde"] } [dependencies.sqlx] workspace = true diff --git a/warden/src/server/api/mod.rs b/warden/src/server/api/mod.rs index ecfbad3..963a3ef 100644 --- a/warden/src/server/api/mod.rs +++ b/warden/src/server/api/mod.rs @@ -1,4 +1,3 @@ -pub mod schema; pub mod transaction; pub mod version; diff --git a/warden/src/server/api/schema.rs b/warden/src/server/api/schema.rs deleted file mode 100644 index e19c341..0000000 --- a/warden/src/server/api/schema.rs +++ /dev/null @@ -1,33 +0,0 @@ -use serde::{Deserialize, Serialize}; -use time::OffsetDateTime; -use utoipa::ToSchema; - -#[derive(Deserialize, Serialize, ToSchema)] -/// Transaction to monitor -pub struct CreateSchema { - #[serde(rename = "type")] - /// Transaction schema type - pub kind: String, - /// The schema's version - pub version: String, - /// Transaction data - #[serde(rename = "json_schema")] - pub schema: serde_json::Value, -} - -/// Transaction to monitor -#[derive(Deserialize, Serialize, Debug, ToSchema)] -pub struct TransactionSchema { - #[serde(rename = "type")] - /// Transaction schema type - pub kind: String, - /// The schema's version - pub version: String, - /// JSON schema for transcation - #[serde(rename = "json_schema")] - pub schema: serde_json::Value, - #[serde(with = "time::serde::rfc3339")] - pub created_at: OffsetDateTime, - #[serde(with = "time::serde::rfc3339")] - pub updated_at: OffsetDateTime, -} diff --git a/warden/src/server/routes/config/mod.rs b/warden/src/server/routes/config/mod.rs index d80c36b..0c02eaa 100644 --- a/warden/src/server/routes/config/mod.rs +++ b/warden/src/server/routes/config/mod.rs @@ -16,5 +16,6 @@ pub fn router(store: Arc<AppState>) -> OpenApiRouter { OpenApiRouter::new() .routes(utoipa_axum::routes!(logs::reload)) .routes(utoipa_axum::routes!(schema::create::create_schema)) + .routes(utoipa_axum::routes!(schema::delete::delete_schema)) .with_state(store) } diff --git a/warden/src/server/routes/config/schema/create.rs b/warden/src/server/routes/config/schema/create.rs index 6a71720..1792df6 100644 --- a/warden/src/server/routes/config/schema/create.rs +++ b/warden/src/server/routes/config/schema/create.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use api_config::schema::SchemaDriver; +use api_config::schema::{CreateSchema, SchemaDriver, TransactionSchema}; use axum::{ Json, debug_handler, extract::State, @@ -12,7 +12,6 @@ use warden_core::state::AppState; use crate::server::{ api::{ - schema::{CreateSchema, TransactionSchema}, version::Version, }, error::AppError, diff --git a/warden/src/server/routes/config/schema/delete.rs b/warden/src/server/routes/config/schema/delete.rs index 8b13789..51a04da 100644 --- a/warden/src/server/routes/config/schema/delete.rs +++ b/warden/src/server/routes/config/schema/delete.rs @@ -1 +1,97 @@ +use std::sync::Arc; +use api_config::schema::{CreateSchema, SchemaDriver, TransactionSchema}; +use axum::{ + Json, debug_handler, + extract::State, + http::{HeaderMap, StatusCode}, + response::IntoResponse, +}; +use tracing::debug; +use warden_core::state::AppState; + +use crate::server::{ + api::{ + version::Version, + }, + error::AppError, + routes::config::CONFIG, +}; + +#[utoipa::path( + delete, + responses( + ( + status = 200, + description = "The schema has been deleted", + headers( + ("x-request-id", description = "Request identifier") + ), + body = TransactionSchema + ), + ( + 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 delete_schema( + State(state): State<Arc<AppState>>, + headers: HeaderMap, + Json(body): Json<CreateSchema>, +) -> Result<impl IntoResponse, AppError> { + // 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"); + Ok(StatusCode::OK) +} |
