diff options
Diffstat (limited to 'crates/configuration')
9 files changed, 184 insertions, 1 deletions
diff --git a/crates/configuration/src/server/http_svc.rs b/crates/configuration/src/server/http_svc.rs index 45cdcfa..b07aece 100644 --- a/crates/configuration/src/server/http_svc.rs +++ b/crates/configuration/src/server/http_svc.rs @@ -11,6 +11,7 @@ use utoipa_scalar::Servable as _; use crate::state::AppHandle; const TAG_ROUTING: &str = "Routing"; +const TAG_RULES: &str = "Rules"; #[derive(OpenApi)] #[openapi( diff --git a/crates/configuration/src/server/http_svc/routes.rs b/crates/configuration/src/server/http_svc/routes.rs index bec7c77..281b231 100644 --- a/crates/configuration/src/server/http_svc/routes.rs +++ b/crates/configuration/src/server/http_svc/routes.rs @@ -1,4 +1,5 @@ mod routing; +mod rule; use utoipa_axum::{router::OpenApiRouter, routes}; @@ -7,8 +8,16 @@ use crate::state::AppHandle; pub fn router(store: AppHandle) -> OpenApiRouter { OpenApiRouter::new() .routes(routes!( + /* routing */ routing::get_active::active_routing, - routing::post_routing::post_routing + routing::post_routing::post_routing, + routing::delete_routing::delete, + routing::replace_routing::replace, + /* rule */ + rule::create::create_rule, + rule::update::update_rule_config, + rule::delete::delete_rule_config, + rule::get::get_rule, )) .with_state(store) } diff --git a/crates/configuration/src/server/http_svc/routes/routing/delete_routing.rs b/crates/configuration/src/server/http_svc/routes/routing/delete_routing.rs index 07148cc..23733d3 100644 --- a/crates/configuration/src/server/http_svc/routes/routing/delete_routing.rs +++ b/crates/configuration/src/server/http_svc/routes/routing/delete_routing.rs @@ -28,6 +28,7 @@ use crate::{ #[axum::debug_handler] #[tracing::instrument(skip(state))] pub async fn delete( + version: Version, State(state): State<AppHandle>, Path(id): Path<String>, axum::Json(body): axum::Json<RoutingConfiguration>, diff --git a/crates/configuration/src/server/http_svc/routes/routing/replace_routing.rs b/crates/configuration/src/server/http_svc/routes/routing/replace_routing.rs index ccf184f..5c7cd02 100644 --- a/crates/configuration/src/server/http_svc/routes/routing/replace_routing.rs +++ b/crates/configuration/src/server/http_svc/routes/routing/replace_routing.rs @@ -27,6 +27,7 @@ use crate::{ #[axum::debug_handler] #[tracing::instrument(skip(state))] pub async fn replace( + version: Version, State(state): State<AppHandle>, Path(id): Path<String>, axum::Json(body): axum::Json<RoutingConfiguration>, diff --git a/crates/configuration/src/server/http_svc/routes/rule.rs b/crates/configuration/src/server/http_svc/routes/rule.rs new file mode 100644 index 0000000..f4b0d33 --- /dev/null +++ b/crates/configuration/src/server/http_svc/routes/rule.rs @@ -0,0 +1,4 @@ +pub mod create; +pub mod delete; +pub mod get; +pub mod update; diff --git a/crates/configuration/src/server/http_svc/routes/rule/create.rs b/crates/configuration/src/server/http_svc/routes/rule/create.rs new file mode 100644 index 0000000..809c00b --- /dev/null +++ b/crates/configuration/src/server/http_svc/routes/rule/create.rs @@ -0,0 +1,38 @@ +use axum::{extract::State, response::IntoResponse}; +use warden_core::configuration::rule::{ + RuleConfiguration, mutate_rule_configuration_server::MutateRuleConfiguration, +}; + +use crate::{ + server::{error::AppError, http_svc::TAG_RULES, version::Version}, + state::AppHandle, +}; + +/// Create rule configuration +#[utoipa::path( + post, + path = "/{version}/rule", + params( + ("version" = Version, Path, description = "API version, e.g., v1, v2, v3"), + ), + responses(( + status = CREATED, + body = RuleConfiguration, + )), + operation_id = "create_rule_configuration", // https://github.com/juhaku/utoipa/issues/1170 + tag = TAG_RULES, + ) +] +#[axum::debug_handler] +#[tracing::instrument(skip(state))] +pub async fn create_rule( + version: Version, + State(state): State<AppHandle>, + axum::Json(body): axum::Json<RuleConfiguration>, +) -> Result<impl IntoResponse, AppError> { + let response = state + .create_rule_configuration(tonic::Request::new(body)) + .await? + .into_inner(); + Ok((axum::http::StatusCode::CREATED, axum::Json(response))) +} diff --git a/crates/configuration/src/server/http_svc/routes/rule/delete.rs b/crates/configuration/src/server/http_svc/routes/rule/delete.rs new file mode 100644 index 0000000..2352fba --- /dev/null +++ b/crates/configuration/src/server/http_svc/routes/rule/delete.rs @@ -0,0 +1,42 @@ +use axum::extract::{Query, State}; +use tonic::IntoRequest; +use warden_core::configuration::rule::{ + DeleteRuleConfigurationRequest, RuleConfiguration, + mutate_rule_configuration_server::MutateRuleConfiguration, +}; + +use crate::{ + server::{error::AppError, http_svc::TAG_RULES, version::Version}, + state::AppHandle, +}; + +/// Delete rule configuration +#[utoipa::path( + delete, + path = "/{version}/rule", + responses(( + status = OK, + body = RuleConfiguration + )), + params( + ("version" = Version, Path, description = "API version, e.g., v1, v2, v3"), + DeleteRuleConfigurationRequest, + ), + operation_id = "delete_rule_configuration", // https://github.com/juhaku/utoipa/issues/1170 + tag = TAG_RULES, + ) +] +#[axum::debug_handler] +#[tracing::instrument(skip(state))] +pub async fn delete_rule_config( + version: Version, + State(state): State<AppHandle>, + Query(body): Query<DeleteRuleConfigurationRequest>, +) -> Result<axum::Json<RuleConfiguration>, AppError> { + let body = state + .delete_rule_configuration(body.into_request()) + .await? + .into_inner(); + + Ok(axum::Json(body)) +} diff --git a/crates/configuration/src/server/http_svc/routes/rule/get.rs b/crates/configuration/src/server/http_svc/routes/rule/get.rs new file mode 100644 index 0000000..935eefb --- /dev/null +++ b/crates/configuration/src/server/http_svc/routes/rule/get.rs @@ -0,0 +1,42 @@ +use axum::extract::{Query, State}; +use warden_core::configuration::rule::{ + RuleConfiguration, RuleConfigurationRequest, + query_rule_configuration_server::QueryRuleConfiguration, +}; + +use crate::{ + server::{error::AppError, http_svc::TAG_RULES, version::Version}, + state::AppHandle, +}; + +/// Get rule configuration +#[utoipa::path( + get, + path = "/{version}/rule", + responses(( + status = OK, + body = RuleConfiguration + )), + params( + ("version" = Version, Path, description = "API version, e.g., v1, v2, v3"), + RuleConfigurationRequest + ), + operation_id = "get_rule_configuration", // https://github.com/juhaku/utoipa/issues/1170 + tag = TAG_RULES, + ) +] +#[axum::debug_handler] +#[tracing::instrument(skip(state))] +pub async fn get_rule( + version: Version, + State(state): State<AppHandle>, + Query(body): Query<RuleConfigurationRequest>, +) -> Result<axum::Json<Option<RuleConfiguration>>, AppError> { + let response = state + .get_rule_configuration(tonic::Request::new(body)) + .await? + .into_inner() + .configuration; + + Ok(axum::Json(response)) +} diff --git a/crates/configuration/src/server/http_svc/routes/rule/update.rs b/crates/configuration/src/server/http_svc/routes/rule/update.rs new file mode 100644 index 0000000..7bf3fe0 --- /dev/null +++ b/crates/configuration/src/server/http_svc/routes/rule/update.rs @@ -0,0 +1,45 @@ +use axum::extract::State; +use tonic::IntoRequest; +use warden_core::configuration::rule::{ + RuleConfiguration, UpdateRuleRequest, mutate_rule_configuration_server::MutateRuleConfiguration, +}; + +use crate::{ + server::{error::AppError, http_svc::TAG_RULES, version::Version}, + state::AppHandle, +}; + +/// Update the routing configuration +#[utoipa::path( + put, + path = "/{version}/rule", + params( + ("version" = Version, Path, description = "API version, e.g., v1, v2, v3"), + ), + responses(( + status = OK, + body = RuleConfiguration + )), + operation_id = "update rule configuration", // https://github.com/juhaku/utoipa/issues/1170 + tag = TAG_RULES, + ) +] +#[axum::debug_handler] +#[tracing::instrument(skip(state))] +pub async fn update_rule_config( + version: Version, + State(state): State<AppHandle>, + axum::Json(body): axum::Json<RuleConfiguration>, +) -> Result<axum::Json<RuleConfiguration>, AppError> { + let config = state + .update_rule_configuration( + UpdateRuleRequest { + configuration: Some(body), + } + .into_request(), + ) + .await? + .into_inner(); + + Ok(axum::Json(config)) +} |