use std::sync::Arc;
use axum::Router;
use super::config::PasAuthConfig;
use super::routes;
use super::session::SessionResolver;
use super::state::AuthState;
use super::sv_aware::SvAwareSessionResolver;
use super::traits::{AccountResolver, RefreshTokenResolver, SessionStore};
use crate::oauth::AuthClient;
use crate::session_version::{MemorySessionVersionCache, SessionVersionCache};
pub struct PasAuth<S: SessionStore, R: RefreshTokenResolver> {
router: Router,
base_resolver: SessionResolver<S>,
store: Arc<S>,
refresh_resolver: Arc<R>,
auth_client: Arc<AuthClient>,
default_cache: Arc<MemorySessionVersionCache>,
}
impl<S: SessionStore, R: RefreshTokenResolver> PasAuth<S, R> {
pub fn new<U: AccountResolver>(
config: PasAuthConfig,
account_resolver: Arc<U>,
session_store: Arc<S>,
refresh_resolver: Arc<R>,
) -> Self {
let cookie_name: Arc<str> = Arc::from(config.settings.session_cookie_name.as_str());
let auth_client = Arc::new(config.client);
let state = AuthState {
client: Arc::clone(&auth_client),
account_resolver,
session_store: Arc::clone(&session_store),
settings: config.settings,
};
let router = routes::build_router(state);
let base_resolver = SessionResolver::new(Arc::clone(&session_store), cookie_name);
Self {
router,
base_resolver,
store: session_store,
refresh_resolver,
auth_client,
default_cache: Arc::new(MemorySessionVersionCache::new()),
}
}
#[must_use]
pub fn resolver(&self) -> SvAwareSessionResolver<S, R, MemorySessionVersionCache> {
SvAwareSessionResolver::new(
self.base_resolver.clone(),
Arc::clone(&self.store),
Arc::clone(&self.refresh_resolver),
Arc::clone(&self.auth_client),
Arc::clone(&self.default_cache),
)
}
#[must_use]
pub fn resolver_with_cache<C: SessionVersionCache>(
&self,
cache: C,
) -> SvAwareSessionResolver<S, R, C> {
SvAwareSessionResolver::new(
self.base_resolver.clone(),
Arc::clone(&self.store),
Arc::clone(&self.refresh_resolver),
Arc::clone(&self.auth_client),
Arc::new(cache),
)
}
pub fn into_router(self) -> Router {
self.router
}
}