microtld/web/src/web/service/extractors/authuser.rs
2026-08-21 12:24:52 +02:00

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))
}
}