torii_core/services/
session.rs

1use crate::{Error, Session, SessionProvider, SessionToken, UserId};
2use chrono::Duration;
3use std::sync::Arc;
4
5/// Service for session management operations
6pub struct SessionService<P: SessionProvider> {
7    provider: Arc<P>,
8}
9
10impl<P: SessionProvider> SessionService<P> {
11    /// Create a new SessionService with the given provider
12    pub fn new(provider: Arc<P>) -> Self {
13        Self { provider }
14    }
15
16    /// Create a new session for a user
17    pub async fn create_session(
18        &self,
19        user_id: &UserId,
20        user_agent: Option<String>,
21        ip_address: Option<String>,
22        expires_in: Duration,
23    ) -> Result<Session, Error> {
24        self.provider
25            .create_session(user_id, user_agent, ip_address, expires_in)
26            .await
27    }
28
29    /// Get a session by token
30    pub async fn get_session(&self, token: &SessionToken) -> Result<Option<Session>, Error> {
31        match self.provider.get_session(token).await {
32            Ok(session) => Ok(Some(session)),
33            Err(crate::Error::Session(crate::error::SessionError::NotFound)) => Ok(None),
34            Err(crate::Error::Session(crate::error::SessionError::Expired)) => Ok(None),
35            Err(e) => Err(e),
36        }
37    }
38
39    /// Delete a session
40    pub async fn delete_session(&self, token: &SessionToken) -> Result<(), Error> {
41        self.provider.delete_session(token).await
42    }
43
44    /// Delete all sessions for a user
45    pub async fn delete_user_sessions(&self, user_id: &UserId) -> Result<(), Error> {
46        self.provider.delete_sessions_for_user(user_id).await
47    }
48
49    /// Clean up expired sessions
50    pub async fn cleanup_expired_sessions(&self) -> Result<(), Error> {
51        self.provider.cleanup_expired_sessions().await
52    }
53}