from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from db.models import Session from schemas.providers import ProvidersType class SessionsRepository: def __init__(self, session: AsyncSession) -> None: self.session = session async def get_session_by_id(self, id: int) -> Session | None: stmt = select(Session).where(Session.id == id) res = await self.session.execute(stmt) return res.scalar_one_or_none() async def get_session_by_user_id(self, user_id: int) -> Session | None: stmt = select(Session).where(Session.user_id == user_id) res = await self.session.execute(stmt) return res.scalar_one_or_none() async def get_session_by_hash(self, token_hash: str) -> Session | None: stmt = select(Session).where(Session.refresh_token_hash == token_hash) res = await self.session.execute(stmt) return res.scalar_one_or_none() async def create(self, user_id: int, refresh_token_hash: str, iss: ProvidersType) -> Session: obj = Session(user_id=user_id, refresh_token_hash=refresh_token_hash, source=iss) self.session.add(obj) await self.session.commit() return obj async def revoke(self, token_id: int): session = await self.get_session_by_id(token_id) session.is_revoked = True session.revoked_at = func.now() await self.session.commit() return session