2025-04-06 22:13:46 +07:00
|
|
|
use axum::{
|
2025-04-07 20:41:14 +07:00
|
|
|
Extension, extract::Request, http::StatusCode, middleware::Next,
|
2025-04-06 22:13:46 +07:00
|
|
|
response::Response,
|
|
|
|
|
};
|
|
|
|
|
use imphnen_iam_service::{UsersItemDtoRaw, UsersRepository};
|
2025-04-07 20:41:14 +07:00
|
|
|
use imphnen_libs::AppState;
|
2025-04-06 22:13:46 +07:00
|
|
|
use imphnen_utils::{common_response, extract_email};
|
|
|
|
|
use std::convert::Infallible;
|
|
|
|
|
|
|
|
|
|
pub async fn auth_middleware(
|
|
|
|
|
Extension(state): Extension<AppState>,
|
|
|
|
|
mut req: Request,
|
|
|
|
|
next: Next,
|
|
|
|
|
) -> Result<Response, Infallible> {
|
|
|
|
|
let headers = req.headers();
|
|
|
|
|
let email = match extract_email(headers) {
|
|
|
|
|
Some(email) => email,
|
|
|
|
|
None => {
|
|
|
|
|
return Ok(common_response(
|
|
|
|
|
StatusCode::UNAUTHORIZED,
|
|
|
|
|
"Invalid or expired token",
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
let repository = UsersRepository::new(&state);
|
|
|
|
|
let user: Option<UsersItemDtoRaw> =
|
|
|
|
|
match repository.query_user_by_email(email).await {
|
|
|
|
|
Ok(user) => Some(user),
|
|
|
|
|
Err(err) => {
|
|
|
|
|
return Ok(common_response(
|
|
|
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
|
&err.to_string(),
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
if user.is_none() {
|
|
|
|
|
return Ok(common_response(
|
|
|
|
|
StatusCode::UNAUTHORIZED,
|
|
|
|
|
"Unauthorized user",
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
req.extensions_mut().insert(user.unwrap());
|
|
|
|
|
Ok(next.run(req).await)
|
|
|
|
|
}
|