use crate::{Error, Session, SessionProvider, SessionToken, UserId};
use chrono::Duration;
use std::sync::Arc;
pub struct SessionService<P: SessionProvider> {
provider: Arc<P>,
}
impl<P: SessionProvider> SessionService<P> {
pub fn new(provider: Arc<P>) -> Self {
Self { provider }
}
pub async fn create_session(
&self,
user_id: &UserId,
user_agent: Option<String>,
ip_address: Option<String>,
expires_in: Duration,
) -> Result<Session, Error> {
self.provider
.create_session(user_id, user_agent, ip_address, expires_in)
.await
}
pub async fn get_session(&self, token: &SessionToken) -> Result<Option<Session>, Error> {
match self.provider.get_session(token).await {
Ok(session) => Ok(Some(session)),
Err(crate::Error::Session(crate::error::SessionError::NotFound)) => Ok(None),
Err(crate::Error::Session(crate::error::SessionError::Expired)) => Ok(None),
Err(e) => Err(e),
}
}
pub async fn delete_session(&self, token: &SessionToken) -> Result<(), Error> {
self.provider.delete_session(token).await
}
pub async fn delete_user_sessions(&self, user_id: &UserId) -> Result<(), Error> {
self.provider.delete_sessions_for_user(user_id).await
}
pub async fn cleanup_expired_sessions(&self) -> Result<(), Error> {
self.provider.cleanup_expired_sessions().await
}
}