aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2026-03-30 10:59:47 +0200
committerrtkay123 <dev@kanjala.com>2026-03-30 11:01:42 +0200
commit562d4855e957bebf8d98b56e40cdd50beea54d84 (patch)
tree26811607f73796751594102465326ebc2ea43c46
parent2e2dc9707c15ed46290849e7e9ec41f012a18d51 (diff)
downloadwarden-562d4855e957bebf8d98b56e40cdd50beea54d84.tar.bz2
warden-562d4855e957bebf8d98b56e40cdd50beea54d84.zip
fix: version in path params
-rw-r--r--Cargo.lock3
-rw-r--r--warden/Cargo.toml2
-rw-r--r--warden/src/server/api/version.rs12
-rw-r--r--warden/src/server/routes/config/schema/create.rs23
-rw-r--r--warden/src/server/routes/config/schema/delete.rs38
-rw-r--r--warden/src/server/routes/config/schema/read.rs11
-rw-r--r--warden/src/server/routes/mod.rs7
7 files changed, 57 insertions, 39 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 821fe2a..c2eaea9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2941,7 +2941,9 @@ checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b"
dependencies = [
"proc-macro2",
"quote",
+ "regex",
"syn",
+ "uuid",
]
[[package]]
@@ -3006,6 +3008,7 @@ checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9"
dependencies = [
"getrandom 0.4.2",
"js-sys",
+ "serde_core",
"wasm-bindgen",
]
diff --git a/warden/Cargo.toml b/warden/Cargo.toml
index d0d008d..1b7c42a 100644
--- a/warden/Cargo.toml
+++ b/warden/Cargo.toml
@@ -21,7 +21,7 @@ tracing.workspace = true
tracing-appender = "0.2.4"
tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
url = { workspace = true, features = ["serde"] }
-utoipa = { version = "5.4.0", features = ["time"] }
+utoipa = { version = "5.4.0", features = ["axum_extras", "time", "uuid"] }
utoipa-axum = "0.2.0"
utoipa-rapidoc = { version = "6.0.0", optional = true }
utoipa-redoc = { version = "6.0.0", optional = true }
diff --git a/warden/src/server/api/version.rs b/warden/src/server/api/version.rs
index 4eb5677..32cfef3 100644
--- a/warden/src/server/api/version.rs
+++ b/warden/src/server/api/version.rs
@@ -6,9 +6,17 @@ use axum::{
http::{StatusCode, request::Parts},
response::{IntoResponse, Response},
};
-use utoipa::ToSchema;
+use serde::{Deserialize, Serialize};
+use utoipa::{IntoParams, ToSchema};
-#[derive(Debug, ToSchema)]
+#[derive(Deserialize,Debug, IntoParams)]
+pub struct VersionPath {
+ pub version: Version,
+}
+
+#[derive(Debug, ToSchema, Deserialize, Serialize)]
+#[serde(rename_all = "lowercase")]
+#[schema(example = "v0")]
pub enum Version {
V0,
}
diff --git a/warden/src/server/routes/config/schema/create.rs b/warden/src/server/routes/config/schema/create.rs
index 1368bd6..91674fe 100644
--- a/warden/src/server/routes/config/schema/create.rs
+++ b/warden/src/server/routes/config/schema/create.rs
@@ -3,16 +3,16 @@ use std::sync::Arc;
use api_config::schema::{CreateSchema, SchemaDriver, TransactionSchema};
use axum::{
Json, debug_handler,
- extract::State,
+ extract::{Path, State},
http::{HeaderMap, StatusCode},
response::IntoResponse,
};
use tracing::{info, trace};
use warden_core::state::AppState;
-use crate::server::{api::version::Version, error::AppError, routes::config::CONFIG};
+use crate::server::{api::version::{Version, VersionPath}, error::AppError, routes::config::CONFIG};
-/// Save a new transaction's schema
+/// Save a transaction's schema
#[utoipa::path(
post,
responses(
@@ -20,7 +20,7 @@ use crate::server::{api::version::Version, error::AppError, routes::config::CONF
status = 201,
description = "The transaction's schema has been saved",
headers(
- ("x-request-id", description = "Request identifier")
+ ("x-request-id" = Uuid, description = "Request identifier")
),
body = TransactionSchema
),
@@ -28,28 +28,28 @@ use crate::server::{api::version::Version, error::AppError, routes::config::CONF
status = 400,
description = "Invalid request",
headers(
- ("x-request-id", description = "Request identifier")
+ ("x-request-id" = Uuid, description = "Request identifier")
)
),
(
status = 405,
description = "Method not allowed",
headers(
- ("x-request-id", description = "Request identifier")
+ ("x-request-id" = Uuid, description = "Request identifier")
)
),
(
status = 409,
description = "Schema with provided type and version is already available",
headers(
- ("x-request-id", description = "Request identifier")
+ ("x-request-id" = Uuid, description = "Request identifier")
)
),
(
status = 500,
description = "Internal server error",
headers(
- ("x-request-id", description = "Request identifier")
+ ("x-request-id" = Uuid, description = "Request identifier")
)
)
),
@@ -58,10 +58,8 @@ use crate::server::{api::version::Version, error::AppError, routes::config::CONF
request_body(
content = CreateSchema
),
- path = "/{version}/config/schema",
- params(
- ("version" = Version, Path, description = "API version, e.g., v1, v2, v3")
- ),
+ params(VersionPath),
+ path = "/{version}/config/schema"
)]
#[tracing::instrument(
name = "create_schema",
@@ -75,6 +73,7 @@ use crate::server::{api::version::Version, error::AppError, routes::config::CONF
#[debug_handler]
pub async fn create_schema(
State(state): State<Arc<AppState>>,
+ Path(version): Path<Version>,
headers: HeaderMap,
Json(body): Json<CreateSchema>,
) -> Result<impl IntoResponse, AppError> {
diff --git a/warden/src/server/routes/config/schema/delete.rs b/warden/src/server/routes/config/schema/delete.rs
index 27df450..5d1459f 100644
--- a/warden/src/server/routes/config/schema/delete.rs
+++ b/warden/src/server/routes/config/schema/delete.rs
@@ -1,15 +1,27 @@
use std::sync::Arc;
-use api_config::schema::{CreateSchema, SchemaDriver};
+use api_config::schema::{SchemaDriver};
use axum::{
- Json, debug_handler,
- extract::State,
+ debug_handler,
+ extract::{Path, Query, State},
http::{HeaderMap, StatusCode},
response::IntoResponse,
};
+use serde::{Deserialize, Serialize};
+use utoipa::{IntoParams, ToSchema};
use warden_core::state::AppState;
-use crate::server::{api::version::Version, error::AppError, routes::config::CONFIG};
+use crate::server::{api::version::{Version, VersionPath}, error::AppError, routes::config::CONFIG};
+
+/// Schema delete query
+#[derive(Deserialize, Serialize, IntoParams, ToSchema)]
+pub struct SchemaDeleteQuery {
+ /// Schema type
+ #[serde(rename = "type")]
+ kind: String,
+ /// Schema version
+ version: String,
+}
/// Delete a transaction's schema
#[utoipa::path(
@@ -19,40 +31,35 @@ use crate::server::{api::version::Version, error::AppError, routes::config::CONF
status = 200,
description = "The schema has been deleted",
headers(
- ("x-request-id", description = "Request identifier")
+ ("x-request-id" = Uuid, description = "Request identifier")
)
),
(
status = 400,
description = "Invalid request",
headers(
- ("x-request-id", description = "Request identifier")
+ ("x-request-id" = Uuid, description = "Request identifier")
)
),
(
status = 405,
description = "Method not allowed",
headers(
- ("x-request-id", description = "Request identifier")
+ ("x-request-id" = Uuid, description = "Request identifier")
)
),
(
status = 500,
description = "Internal server error",
headers(
- ("x-request-id", description = "Request identifier")
+ ("x-request-id" = Uuid, 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")
- ),
+ params(VersionPath),
)]
#[tracing::instrument(
name = "delete_schema",
@@ -67,7 +74,8 @@ use crate::server::{api::version::Version, error::AppError, routes::config::CONF
pub async fn delete_schema(
State(state): State<Arc<AppState>>,
headers: HeaderMap,
- Json(body): Json<CreateSchema>,
+ Path(version): Path<Version>,
+ Query(body): Query<SchemaDeleteQuery>,
) -> Result<impl IntoResponse, AppError> {
// TODO: should also clear cached ones eventually
state
diff --git a/warden/src/server/routes/config/schema/read.rs b/warden/src/server/routes/config/schema/read.rs
index 0cdbac8..45b5006 100644
--- a/warden/src/server/routes/config/schema/read.rs
+++ b/warden/src/server/routes/config/schema/read.rs
@@ -3,7 +3,7 @@ use std::sync::Arc;
use api_config::schema::{SchemaDriver, TransactionSchema};
use axum::{
Json, debug_handler,
- extract::{Query, State},
+ extract::{Path, Query, State},
http::{HeaderMap, StatusCode},
response::IntoResponse,
};
@@ -12,11 +12,10 @@ use tracing::debug;
use utoipa::{IntoParams, ToSchema};
use warden_core::state::AppState;
-use crate::server::{api::version::Version, error::AppError, routes::config::CONFIG};
+use crate::server::{api::version::{Version, VersionPath}, error::AppError, routes::config::CONFIG};
/// Schema search query
#[derive(Deserialize, Serialize, IntoParams, ToSchema)]
-#[into_params(parameter_in = Query)]
pub struct SchemaSearchQuery {
/// Schema type
#[serde(rename = "type")]
@@ -69,10 +68,7 @@ pub struct SchemaSearchQuery {
operation_id = "get_schema", // https://github.com/juhaku/utoipa/issues/1170
tag = CONFIG,
path = "/{version}/config/schema",
- params(
- ("version" = Version, Path, description = "API version, e.g., v1, v2, v3"),
- SchemaSearchQuery
- ),
+ params(VersionPath, SchemaSearchQuery),
)]
#[tracing::instrument(
name = "get_schema",
@@ -87,6 +83,7 @@ pub struct SchemaSearchQuery {
pub async fn get_schema(
State(state): State<Arc<AppState>>,
headers: HeaderMap,
+ Path(version): Path<Version>,
body: Query<SchemaSearchQuery>,
) -> Result<impl IntoResponse, AppError> {
debug!("searching for schema");
diff --git a/warden/src/server/routes/mod.rs b/warden/src/server/routes/mod.rs
index f2375de..5994987 100644
--- a/warden/src/server/routes/mod.rs
+++ b/warden/src/server/routes/mod.rs
@@ -5,11 +5,14 @@ use axum::response::IntoResponse;
use utoipa::OpenApi;
+use crate::server::api::version::Version;
+
#[derive(OpenApi)]
#[openapi(
tags(
(name = env!("CARGO_PKG_NAME"), description = "API health check"),
- )
+ ),
+ components(schemas(Version))
)]
pub(super) struct ApiDoc;
@@ -22,7 +25,7 @@ pub(super) struct ApiDoc;
status = OK, description = "Warden is live",
body = Option<str>, content_type = "text/plain",
headers(
- ("x-request-id" = String, description = "Request identifier")
+ ("x-request-id" = Uuid, description = "Request identifier")
)
)
),