38 lines
1.4 KiB
Python
38 lines
1.4 KiB
Python
from sqlalchemy import func, select
|
|
|
|
from db.models import Session
|
|
from db.session import UnitOfWork
|
|
from schemas.providers import ProvidersType
|
|
|
|
|
|
class SessionsRepository:
|
|
def __init__(self, uow: UnitOfWork) -> None:
|
|
self.uow = uow
|
|
self.session = uow.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)
|
|
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()
|
|
return session
|