41 lines
1.3 KiB
Rust
41 lines
1.3 KiB
Rust
use axum::{async_trait, body::Body, extract::{FromRequest, FromRequestParts, Query}};
|
|
use http::Request;
|
|
use i18n::{message, message_ids::MessageId};
|
|
use validator::Validate;
|
|
|
|
use crate::utils::request_util;
|
|
|
|
use super::response::ResErr;
|
|
|
|
pub struct QueryValidator<T>(pub T);
|
|
|
|
#[async_trait]
|
|
impl<S, T> FromRequest<S> for QueryValidator<T>
|
|
where
|
|
S: Send + Sync,
|
|
T: Validate,
|
|
Query<T>: FromRequestParts<S>,
|
|
{
|
|
type Rejection = ResErr;
|
|
|
|
async fn from_request(req: http::Request<Body>, state: &S) -> Result<Self, Self::Rejection> {
|
|
let (parts, body) = req.into_parts();
|
|
let header = &parts.headers;
|
|
let query = Query::<T>::from_request(Request::from_parts(parts.clone(), body), state).await;
|
|
|
|
if let Ok(Query(data)) = query {
|
|
match data.validate() {
|
|
Ok(_) => Ok(QueryValidator(data)),
|
|
Err(_) => {
|
|
let lang_tag = request_util::get_lang_tag(header);
|
|
let err = Err(ResErr::params(message!(&lang_tag, MessageId::InvalidParams)));
|
|
err
|
|
},
|
|
}
|
|
} else {
|
|
let lang_tag = request_util::get_lang_tag(header);
|
|
let err = Err(ResErr::params(message!(&lang_tag, MessageId::InvalidParams)));
|
|
err
|
|
}
|
|
}
|
|
} |