aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/api-config/src/schema/create.rs32
-rw-r--r--lib/api-config/src/schema/mod.rs55
-rw-r--r--lib/warden-core/Cargo.toml2
-rw-r--r--warden/src/server/api/mod.rs1
-rw-r--r--warden/src/server/api/schema.rs33
-rw-r--r--warden/src/server/routes/config/mod.rs1
-rw-r--r--warden/src/server/routes/config/schema/create.rs3
-rw-r--r--warden/src/server/routes/config/schema/delete.rs96
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)
+}