nythos_core/ports/
session.rs1use crate::{NythosResult, RefreshToken, Session, SessionId, TenantId, UserId};
2
3#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct SessionRecord {
10 session: Session,
11 refresh_token: RefreshToken,
12}
13
14impl SessionRecord {
15 pub fn new(session: Session, refresh_token: RefreshToken) -> Self {
16 Self {
17 session,
18 refresh_token,
19 }
20 }
21
22 pub fn session(&self) -> &Session {
23 &self.session
24 }
25
26 pub fn refresh_token(&self) -> &RefreshToken {
27 &self.refresh_token
28 }
29
30 pub fn into_parts(self) -> (Session, RefreshToken) {
31 (self.session, self.refresh_token)
32 }
33}
34
35#[derive(Debug, Clone, PartialEq, Eq)]
40pub struct RefreshTokenRotation {
41 session_id: SessionId,
42 previous: RefreshToken,
43 next: RefreshToken,
44}
45
46impl RefreshTokenRotation {
47 pub fn new(session_id: SessionId, previous: RefreshToken, next: RefreshToken) -> Self {
48 Self {
49 session_id,
50 previous,
51 next,
52 }
53 }
54
55 pub const fn session_id(&self) -> SessionId {
56 self.session_id
57 }
58
59 pub fn previous(&self) -> &RefreshToken {
60 &self.previous
61 }
62
63 pub fn next(&self) -> &RefreshToken {
64 &self.next
65 }
66
67 pub fn into_parts(self) -> (SessionId, RefreshToken, RefreshToken) {
68 (self.session_id, self.previous, self.next)
69 }
70}
71
72pub trait SessionStore {
80 async fn create_session(&self, record: SessionRecord) -> NythosResult<()>;
82
83 async fn find_by_refresh_token(
85 &self,
86 refresh_token: &RefreshToken,
87 ) -> NythosResult<Option<SessionRecord>>;
88
89 async fn rotate_refresh_token(&self, rotation: RefreshTokenRotation) -> NythosResult<()>;
94
95 async fn revoke_session(&self, session_id: SessionId) -> NythosResult<()>;
97
98 async fn revoke_all_for_user(&self, tenant_id: TenantId, user_id: UserId) -> NythosResult<()>;
100}