37 lines
1013 B
Rust
37 lines
1013 B
Rust
use crate::web::service::auth::user::User;
|
|
use crate::web::service::AppState;
|
|
use axum::{
|
|
extract::FromRequestParts,
|
|
http::{request::Parts, StatusCode},
|
|
};
|
|
use tower_sessions::Session;
|
|
use uuid::Uuid;
|
|
|
|
pub struct AuthUser(pub User);
|
|
|
|
impl FromRequestParts<AppState> for AuthUser {
|
|
type Rejection = StatusCode;
|
|
|
|
async fn from_request_parts(
|
|
parts: &mut Parts,
|
|
state: &AppState,
|
|
) -> Result<Self, Self::Rejection> {
|
|
let session = Session::from_request_parts(parts, state)
|
|
.await
|
|
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
|
|
|
|
let user_id: Uuid = session
|
|
.get("user_id")
|
|
.await
|
|
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?
|
|
.ok_or(StatusCode::UNAUTHORIZED)?;
|
|
|
|
let user: User = User::get_user_by_id(user_id, &state.db).await
|
|
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?
|
|
.ok_or(StatusCode::UNAUTHORIZED)?;
|
|
|
|
Ok(AuthUser(user))
|
|
}
|
|
}
|
|
|