use async_trait::async_trait;
use chrono::Duration;
use crate::{Error, Session, SessionToken, UserId};
#[async_trait]
pub trait SessionProvider: Send + Sync {
async fn create_session(
&self,
user_id: &UserId,
user_agent: Option<String>,
ip_address: Option<String>,
duration: Duration,
) -> Result<Session, Error>;
async fn get_session(&self, token: &SessionToken) -> Result<Session, Error>;
async fn delete_session(&self, token: &SessionToken) -> Result<(), Error>;
async fn cleanup_expired_sessions(&self) -> Result<(), Error>;
async fn delete_sessions_for_user(&self, user_id: &UserId) -> Result<(), Error>;
}
#[async_trait]
impl SessionProvider for Box<dyn SessionProvider> {
async fn create_session(
&self,
user_id: &UserId,
user_agent: Option<String>,
ip_address: Option<String>,
duration: Duration,
) -> Result<Session, Error> {
(**self)
.create_session(user_id, user_agent, ip_address, duration)
.await
}
async fn get_session(&self, token: &SessionToken) -> Result<Session, Error> {
(**self).get_session(token).await
}
async fn delete_session(&self, token: &SessionToken) -> Result<(), Error> {
(**self).delete_session(token).await
}
async fn cleanup_expired_sessions(&self) -> Result<(), Error> {
(**self).cleanup_expired_sessions().await
}
async fn delete_sessions_for_user(&self, user_id: &UserId) -> Result<(), Error> {
(**self).delete_sessions_for_user(user_id).await
}
}