From e0d9d708dcb2190b7981f281a55449358b910f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=BF=90=E5=AE=B6?= Date: Tue, 1 Oct 2024 16:33:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0context=5Fextractor=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E5=B0=86XXXX=5Fvalidator=E5=8F=98=E6=9B=B4=E4=B8=BAXX?= =?UTF-8?q?XX=5Fextractor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.MD | 2 +- library/src/model/mod.rs | 3 ++- library/src/{validator => model}/validator.rs | 0 .../{body_validator.rs => body_extractor.rs} | 4 ++-- library/src/validator/context_extractor.rs | 18 ++++++++++++++++++ library/src/validator/mod.rs | 8 ++++---- .../{path_validator.rs => path_extractor.rs} | 0 .../{query_validator.rs => query_extractor.rs} | 2 +- server/src/controller/account_controller.rs | 9 ++++----- server/src/controller/feedback_controller.rs | 9 ++++----- 10 files changed, 36 insertions(+), 19 deletions(-) rename library/src/{validator => model}/validator.rs (100%) rename library/src/validator/{body_validator.rs => body_extractor.rs} (94%) create mode 100644 library/src/validator/context_extractor.rs rename library/src/validator/{path_validator.rs => path_extractor.rs} (100%) rename library/src/validator/{query_validator.rs => query_extractor.rs} (91%) diff --git a/README.MD b/README.MD index 2ea6b33..c3827eb 100644 --- a/README.MD +++ b/README.MD @@ -1,5 +1,5 @@ ### todo - [*] 使用Extractor方式提取数据,包括Body、Query和Path - [ ] multipart/form-data的实现 -- [ ] 参考example中的jwt实现方式,移除context对extension的依赖?那么language-tag该怎么处理? +- [*] 参考example中的jwt实现方式,移除context对extension的依赖?那么language-tag该怎么处理? - [ ] 参考rocket,移除参数的元组类型 diff --git a/library/src/model/mod.rs b/library/src/model/mod.rs index 3ae0378..0cf7839 100644 --- a/library/src/model/mod.rs +++ b/library/src/model/mod.rs @@ -1 +1,2 @@ -pub mod response; \ No newline at end of file +pub mod response; +pub mod validator; \ No newline at end of file diff --git a/library/src/validator/validator.rs b/library/src/model/validator.rs similarity index 100% rename from library/src/validator/validator.rs rename to library/src/model/validator.rs diff --git a/library/src/validator/body_validator.rs b/library/src/validator/body_extractor.rs similarity index 94% rename from library/src/validator/body_validator.rs rename to library/src/validator/body_extractor.rs index 8f96859..6c683ee 100644 --- a/library/src/validator/body_validator.rs +++ b/library/src/validator/body_extractor.rs @@ -45,7 +45,7 @@ where match axum::Json::::from_request(req, state).await { Ok(value) => { let data = value.0; - match super::validator::validate_params(&data, lang_tag) { + match crate::model::validator::validate_params(&data, lang_tag) { Ok(_) => return Ok(Self(data)), Err(err) => return Err(err), } @@ -60,7 +60,7 @@ where match axum::Form::::from_request(req, state).await { Ok(value) => { let data = value.0; - match super::validator::validate_params(&data, lang_tag) { + match crate::model::validator::validate_params(&data, lang_tag) { Ok(_) => return Ok(Self(data)), Err(err) => return Err(err), } diff --git a/library/src/validator/context_extractor.rs b/library/src/validator/context_extractor.rs new file mode 100644 index 0000000..2cb04eb --- /dev/null +++ b/library/src/validator/context_extractor.rs @@ -0,0 +1,18 @@ +use axum::{async_trait, extract::FromRequestParts}; +use http::request::Parts; + +use crate::{context::Context, model::response::ResErr}; + + +#[async_trait] +impl FromRequestParts for Context +where + S: Send + Sync, +{ + type Rejection = ResErr; + + async fn from_request_parts(parts: &mut Parts, _: &S) -> Result { + let context: &Context = parts.extensions.get().unwrap(); + Ok(context.clone()) + } +} \ No newline at end of file diff --git a/library/src/validator/mod.rs b/library/src/validator/mod.rs index 099d689..c38932e 100644 --- a/library/src/validator/mod.rs +++ b/library/src/validator/mod.rs @@ -1,4 +1,4 @@ -pub mod validator; -pub mod query_validator; -pub mod path_validator; -pub mod body_validator; \ No newline at end of file +pub mod query_extractor; +pub mod path_extractor; +pub mod body_extractor; +pub mod context_extractor; \ No newline at end of file diff --git a/library/src/validator/path_validator.rs b/library/src/validator/path_extractor.rs similarity index 100% rename from library/src/validator/path_validator.rs rename to library/src/validator/path_extractor.rs diff --git a/library/src/validator/query_validator.rs b/library/src/validator/query_extractor.rs similarity index 91% rename from library/src/validator/query_validator.rs rename to library/src/validator/query_extractor.rs index 2475a4d..00e569b 100644 --- a/library/src/validator/query_validator.rs +++ b/library/src/validator/query_extractor.rs @@ -23,7 +23,7 @@ where let context: &Context = parts.extensions.get().unwrap(); if let Ok(Query(data)) = query { - match super::validator::validate_params(&data, context.get_lang_tag()) { + match crate::model::validator::validate_params(&data, context.get_lang_tag()) { Ok(_) => Ok(Self(data)), Err(err) => Err(err), } diff --git a/server/src/controller/account_controller.rs b/server/src/controller/account_controller.rs index c4b620c..344b50a 100644 --- a/server/src/controller/account_controller.rs +++ b/server/src/controller/account_controller.rs @@ -1,6 +1,5 @@ -use axum::Extension; use domain::{dto::account::{AuthenticateGooleAccountReq, AuthenticateWithPassword, RefreshToken}, vo::account::{LoginAccount, RefreshTokenResult}}; -use library::{context::Context, model::response::ResResult, validator::body_validator::JsonBody}; +use library::{context::Context, model::response::ResResult, validator::body_extractor::JsonBody}; use crate::service; @@ -8,7 +7,7 @@ use crate::service; /// /// google账号登录 pub async fn authenticate_google( - Extension(context): Extension, + context: Context, JsonBody(req): JsonBody ) -> ResResult { service::account_service::authenticate_google(context, req).await @@ -18,7 +17,7 @@ pub async fn authenticate_google( /// /// 账号密码登录 pub async fn authenticate_with_password( - Extension(context): Extension, + context: Context, JsonBody(req): JsonBody ) -> ResResult { service::sys_account_service::authenticate_with_password(context, req).await @@ -28,7 +27,7 @@ pub async fn authenticate_with_password( /// /// 刷新token pub async fn refresh_token( - Extension(context): Extension, + context: Context, JsonBody(refresh_token): JsonBody ) -> ResResult { tracing::debug!("刷新token, {:?}", context); diff --git a/server/src/controller/feedback_controller.rs b/server/src/controller/feedback_controller.rs index fe33b22..9ee21c8 100644 --- a/server/src/controller/feedback_controller.rs +++ b/server/src/controller/feedback_controller.rs @@ -1,11 +1,10 @@ -use axum::Extension; use domain::dto::feedback::FeedbackAdd; use domain::dto::pageable::PageParams; use domain::vo::feedback::FeedbackPageable; use library::context::Context; use library::model::response::ResResult; -use library::validator::body_validator::JsonBody; -use library::validator::query_validator::QueryParams; +use library::validator::body_extractor::JsonBody; +use library::validator::query_extractor::QueryParams; use crate::service; @@ -13,7 +12,7 @@ use crate::service; /// /// 添加反馈信息 pub async fn add_feedback( - Extension(context): Extension, + context: Context, JsonBody(req): JsonBody, ) -> ResResult<()> { service::feedback_service::add_feedback(context, req).await @@ -23,7 +22,7 @@ pub async fn add_feedback( /// /// 获取反馈信息列表 pub async fn get_feedback_list_by_page( - Extension(context): Extension, + context: Context, QueryParams(page_params): QueryParams, ) -> ResResult { service::feedback_service::get_feedback_list_by_page(