diff options
| -rw-r--r-- | Cargo.lock | 3 | ||||
| -rw-r--r-- | warden/Cargo.toml | 2 | ||||
| -rw-r--r-- | warden/src/server/api/version.rs | 12 | ||||
| -rw-r--r-- | warden/src/server/routes/config/schema/create.rs | 23 | ||||
| -rw-r--r-- | warden/src/server/routes/config/schema/delete.rs | 38 | ||||
| -rw-r--r-- | warden/src/server/routes/config/schema/read.rs | 11 | ||||
| -rw-r--r-- | warden/src/server/routes/mod.rs | 7 |
7 files changed, 57 insertions, 39 deletions
@@ -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") ) ) ), |
