Skip to main content

shared/application/session/
session_service.rs

1use crate::error::Result;
2
3use crate::domain::model::Session;
4use crate::intern::session::SessionService;
5
6impl SessionService {
7    #[tracing::instrument(
8        name = "auth.issue_session", skip(self), fields(user.id = user_id)
9    )]
10    pub async fn issue_session(
11        &self,
12        user_id: &str,
13        full_permissions: Vec<String>,
14    ) -> Result<String> {
15        self.session_repository.revoke(user_id).await?;
16
17        let token = self.crypto.token.generate()?;
18        let hashed_token = self.crypto.token.hash(&token);
19
20        let session = Session::default()
21            .with_user_id(user_id)
22            .with_token(&hashed_token)
23            .with_role(&self.configuration.auth.rbac.default_role)
24            .with_permissions(full_permissions);
25        self.session_repository.insert(session).await?;
26
27        Ok(token)
28    }
29
30    #[tracing::instrument(name = "auth.find_session", skip(self, token))]
31    pub async fn find_session(&self, token: &str) -> Result<Session> {
32        let hash = self.crypto.token.hash(token);
33        self.session_repository.find(&hash).await
34    }
35
36    #[tracing::instrument(name = "auth.invalidate_session", skip(self, token))]
37    pub async fn invalidate_session(&self, token: &str) -> Result<()> {
38        self.session_repository.invalidate(token).await?;
39        Ok(())
40    }
41
42    #[tracing::instrument(name = "auth.extend_timeout", skip(self, session_id))]
43    pub async fn extend_timeout(&self, session_id: &str) -> Result<Session> {
44        self.session_repository.extend_timeout(session_id).await
45    }
46}