use crate::{NythosResult, RefreshToken, Session, SessionId, TenantId, UserId};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SessionRecord {
session: Session,
refresh_token: RefreshToken,
}
impl SessionRecord {
pub fn new(session: Session, refresh_token: RefreshToken) -> Self {
Self {
session,
refresh_token,
}
}
pub fn session(&self) -> &Session {
&self.session
}
pub fn refresh_token(&self) -> &RefreshToken {
&self.refresh_token
}
pub fn into_parts(self) -> (Session, RefreshToken) {
(self.session, self.refresh_token)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RefreshTokenRotation {
session_id: SessionId,
previous: RefreshToken,
next: RefreshToken,
}
impl RefreshTokenRotation {
pub fn new(session_id: SessionId, previous: RefreshToken, next: RefreshToken) -> Self {
Self {
session_id,
previous,
next,
}
}
pub const fn session_id(&self) -> SessionId {
self.session_id
}
pub fn previous(&self) -> &RefreshToken {
&self.previous
}
pub fn next(&self) -> &RefreshToken {
&self.next
}
pub fn into_parts(self) -> (SessionId, RefreshToken, RefreshToken) {
(self.session_id, self.previous, self.next)
}
}
pub trait SessionStore {
async fn create_session(&self, record: SessionRecord) -> NythosResult<()>;
async fn find_by_refresh_token(
&self,
refresh_token: &RefreshToken,
) -> NythosResult<Option<SessionRecord>>;
async fn rotate_refresh_token(&self, rotation: RefreshTokenRotation) -> NythosResult<()>;
async fn revoke_session(&self, session_id: SessionId) -> NythosResult<()>;
async fn revoke_all_for_user(&self, tenant_id: TenantId, user_id: UserId) -> NythosResult<()>;
}