use super::JWTVerifier;
use axum::{
extract::{FromRef, FromRequestParts},
http::{StatusCode, request::Parts},
};
use axum_extra::{
TypedHeader,
headers::{Authorization, authorization::Bearer},
};
pub struct Admin;
impl<S> FromRequestParts<S> for Admin
where
S: Send + Sync,
JWTVerifier: FromRef<S>,
{
type Rejection = StatusCode;
async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
let header = Option::<TypedHeader<Authorization<Bearer>>>::from_request_parts(parts, state)
.await
.unwrap()
.ok_or(StatusCode::UNAUTHORIZED)?;
let TypedHeader(auth) = header;
let jwt = JWTVerifier::from_ref(state);
let admin = jwt
.claims(auth.token())
.ok_or(StatusCode::BAD_REQUEST)?
.custom
.admin;
if admin {
Ok(Self)
} else {
Err(StatusCode::FORBIDDEN)
}
}
}