From 5daafb26eedb27947c9d90c568bc8474210e413c Mon Sep 17 00:00:00 2001 From: Ning Sun Date: Fri, 28 Oct 2022 10:12:39 +0800 Subject: [PATCH] refactor: use struct to represent query so we can doc it via aide --- src/servers/src/http.rs | 9 +++----- src/servers/src/http/handler.rs | 24 +++++++++++++++------ src/servers/tests/http/http_handler_test.rs | 19 +++++++++------- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/servers/src/http.rs b/src/servers/src/http.rs index 001be730f9..1ab5128843 100644 --- a/src/servers/src/http.rs +++ b/src/servers/src/http.rs @@ -262,15 +262,12 @@ impl HttpServer { let sql_router = ApiRouter::with_state(self.sql_handler.clone()) .api_route( "/sql", - apirouting::get_with(handler::sql, handler::sql_docs), - ) - .api_route( - "/sql", - apirouting::post_with(handler::sql, handler::sql_docs), + apirouting::get_with(handler::sql, handler::sql_docs) + .post_with(handler::sql, handler::sql_docs), ) .api_route("/scripts", apirouting::post(handler::scripts)) .api_route("/run-script", apirouting::post(handler::run_script)) - .route("/api.json", apirouting::get(serve_api)) + .route("/private/api.json", apirouting::get(serve_api)) .finish_api(&mut api) .layer(Extension(api)); diff --git a/src/servers/src/http/handler.rs b/src/servers/src/http/handler.rs index c95173ac72..8cd80fde0b 100644 --- a/src/servers/src/http/handler.rs +++ b/src/servers/src/http/handler.rs @@ -9,13 +9,19 @@ use serde::{Deserialize, Serialize}; use crate::http::JsonResponse; use crate::query_handler::SqlQueryHandlerRef; +#[derive(Debug, Default, Serialize, Deserialize, JsonSchema)] +pub struct SqlQuery { + pub database: Option, + pub sql: Option, +} + /// Handler to execute sql #[axum_macros::debug_handler] pub async fn sql( State(sql_handler): State, - Query(params): Query>, + Query(params): Query, ) -> Json { - if let Some(sql) = params.get("sql") { + if let Some(ref sql) = params.sql { Json(JsonResponse::from_output(sql_handler.do_query(sql).await).await) } else { Json(JsonResponse::with_error(Some( @@ -25,8 +31,7 @@ pub async fn sql( } pub(crate) fn sql_docs(op: TransformOperation) -> TransformOperation { - op.id("sql") - .description("Execute SQL query provided by `sql` parameter") + op.description("Execute SQL query provided by `sql` parameter") .response::<200, Json>() } @@ -40,7 +45,7 @@ pub async fn metrics(Query(_params): Query>) -> String { } } -#[derive(Deserialize, Serialize, JsonSchema)] +#[derive(Debug, Deserialize, Serialize, JsonSchema)] pub struct ScriptExecution { pub name: String, pub script: String, @@ -69,13 +74,18 @@ pub async fn scripts( Json(body) } +#[derive(Debug, Serialize, Deserialize, JsonSchema)] +pub struct RunScriptQuery { + name: Option, +} + /// Handler to execute script #[axum_macros::debug_handler] pub async fn run_script( State(query_handler): State, - Query(params): Query>, + Query(params): Query, ) -> Json { - let name = params.get("name"); + let name = params.name.as_ref(); if name.is_none() || name.unwrap().is_empty() { return Json(JsonResponse::with_error(Some("Invalid name".to_string()))); diff --git a/src/servers/tests/http/http_handler_test.rs b/src/servers/tests/http/http_handler_test.rs index cf88b7fc6c..c504b72d53 100644 --- a/src/servers/tests/http/http_handler_test.rs +++ b/src/servers/tests/http/http_handler_test.rs @@ -13,7 +13,11 @@ use crate::create_testing_sql_query_handler; #[tokio::test] async fn test_sql_not_provided() { let query_handler = create_testing_sql_query_handler(MemTable::default_numbers_table()); - let Json(json) = http_handler::sql(State(query_handler), Query(HashMap::default())).await; + let Json(json) = http_handler::sql( + State(query_handler), + Query(http_handler::SqlQuery::default()), + ) + .await; assert!(!json.success()); assert_eq!( Some(&"sql parameter is required.".to_string()), @@ -46,8 +50,7 @@ async fn test_metrics() { counter!("test_metrics", 1); - let query = create_query(); - let text = http_handler::metrics(query).await; + let text = http_handler::metrics(Query(HashMap::default())).await; assert!(text.contains("test_metrics counter")); } @@ -76,9 +79,9 @@ def test(n): }) } -fn create_query() -> Query> { - Query(HashMap::from([( - "sql".to_string(), - "select sum(uint32s) from numbers limit 20".to_string(), - )])) +fn create_query() -> Query { + Query(http_handler::SqlQuery { + sql: Some("select sum(uint32s) from numbers limit 20".to_string()), + database: None, + }) }