use axum::extract::FromRequestParts;
use axum::http::StatusCode;
use axum_extra::extract::PrivateCookieJar;
use super::traits::SessionStore;
use crate::types::{PpnumId, SessionId, UserId};
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct AuthPpnum {
pub session_id: SessionId,
pub user_id: UserId,
pub ppnum_id: PpnumId,
}
impl AuthPpnum {
#[must_use]
pub fn new(session_id: SessionId, user_id: UserId, ppnum_id: PpnumId) -> Self {
Self {
session_id,
user_id,
ppnum_id,
}
}
}
impl<S: Send + Sync> FromRequestParts<S> for AuthPpnum {
type Rejection = StatusCode;
async fn from_request_parts(
parts: &mut axum::http::request::Parts,
_state: &S,
) -> Result<Self, Self::Rejection> {
parts
.extensions
.get::<AuthPpnum>()
.cloned()
.ok_or(StatusCode::UNAUTHORIZED)
}
}
pub async fn resolve_session<S: SessionStore>(
session_store: &S,
jar: &PrivateCookieJar,
cookie_name: &str,
) -> Result<Option<S::AuthContext>, S::Error> {
let session_id = match jar.get(cookie_name) {
Some(c) => SessionId(c.value().to_string()),
None => return Ok(None),
};
session_store.find(&session_id).await
}