40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
from datetime import datetime
|
|
|
|
from fastapi_async_sqlalchemy import db
|
|
from pytz import timezone
|
|
from sqlalchemy import select
|
|
from uuid6 import UUID
|
|
|
|
from app.core.config import settings
|
|
from app.models import RefreshTokenModel
|
|
from app.repositories import BaseRepository
|
|
|
|
|
|
class TokenRepository(BaseRepository[RefreshTokenModel]):
|
|
def __init__(self, model):
|
|
super().__init__(model)
|
|
|
|
async def find_valid_token(self, token: str, user_id: UUID):
|
|
query = select(self.model).where(
|
|
self.model.token == token,
|
|
self.model.user_id == str(user_id),
|
|
self.model.expires_at > datetime.now(timezone(settings.TIMEZONE)),
|
|
self.model.revoked == False,
|
|
)
|
|
result = await db.session.execute(query)
|
|
return result.scalars().first()
|
|
|
|
async def revoke_token(self, token: str):
|
|
token_obj = await self.find_by_token(token)
|
|
if token_obj:
|
|
token_obj.revoked = True
|
|
db.session.add(token_obj)
|
|
await db.session.commit()
|
|
return True
|
|
return False
|
|
|
|
async def find_by_token(self, token: str):
|
|
query = select(self.model).where(self.model.token == token)
|
|
result = await db.session.execute(query)
|
|
return result.scalars().first()
|