This commit is contained in:
2026-08-04 17:11:33 +03:00
parent 8fa72daa6b
commit 4e14972cf6
11 changed files with 106 additions and 70 deletions
+16 -17
View File
@@ -2,7 +2,6 @@
from uuid import UUID
from sqlalchemy import and_, not_, select
from sqlalchemy.exc import NoResultFound
from sqlalchemy.orm import sessionmaker
from src.errors.http_errors.errors import Errors
@@ -37,33 +36,33 @@ class JwtCrudActions:
with self.Session() as session: # noqa: SIM117
with session.begin():
new_token=RefreshTokens(**data)
response=session.add(new_token)
return response
session.add(new_token)
def update_token(self, old_jti:UUID, new_jti:UUID)->bool:
with self.Session() as session: # noqa: SIM117
with session.begin():
query=select(RefreshTokens).where(RefreshTokens.id==old_jti)
response=session.scalars(query).one()
response.is_revoked=True
response.replaced_by=new_jti
return True
response = session.scalars(query).one_or_none()
if response is None:
return False
else:
response.is_revoked=True
response.replaced_by=new_jti
return True
def create_and_update_token(self,data:dict, old_jti:UUID, new_jti:UUID)->bool:
with self.Session() as session: #noqa:SIM117
with session.begin():
new_token=RefreshTokens(**data)
session.add(new_token)
query=select(RefreshTokens).where(RefreshTokens.id==old_jti)
try:
response = session.scalars(query).one()
except NoResultFound as e:
raise self.error.not_found_error(detail="Token not found") from e
response.is_revoked=True
response.replaced_by=new_jti
return True
response = session.scalars(query).one_or_none()
if response is None:
return False
else:
session.add(new_token)
response.is_revoked=True
response.replaced_by=new_jti
return True
def revoke_all(self, user_id:UUID)->bool:
+2 -1
View File
@@ -8,9 +8,10 @@ from src.models.pydantic_models.model import UserOutDB
class UsersCrudActions:
def __init__(self) -> None:
self.Session=sessionmaker(bind=engine)
def get_user_by_email(self, email:str)->UserOutDB|None:
with self.Session() as session: # noqa: SIM117
with session.begin():
+15 -13
View File
@@ -9,14 +9,14 @@ from src.errors.http_errors.errors import Errors
from src.models.configs_read.env import env_settings
from src.models.pydantic_models.model import RefreshTokensCreate, UserOut
from .jwt import Hashes, Jwt
from .jwt import HashService, JwtService
class CurrentUser:
class CurrentUserService:
def __init__(self) -> None:
self.jwt_service=Jwt()
self.hash=Hashes()
self.jwt_service=JwtService()
self.hash=HashService()
self.crud_db_actions=UsersCrudActions()
self.jwt_db_actions=JwtCrudActions()
self.error=Errors()
@@ -147,9 +147,12 @@ class CurrentUser:
expires_at=datetime.now(UTC)+timedelta(days=env_settings.REFRESH_TOKEN_EXPIRE_DAYS),
)
self.jwt_db_actions.create_and_update_token(RefreshTokensCreate.model_dump(new_token_record), old_jti, new_jti)
success = self.jwt_db_actions.create_and_update_token(RefreshTokensCreate.model_dump(new_token_record), old_jti, new_jti)
return (new_access_token,new_refresh_token)
if not success:
raise self.error.not_found_error(detail="Token not found")
return (new_access_token, new_refresh_token)
@@ -163,15 +166,14 @@ class CurrentUser:
try:
jti=UUID(jti)
except (ValueError, TypeError) as e:
except (ValueError, TypeError, AttributeError) as e:
raise self.error.credentials_error(detail="Jwt token is incorrect") from e
current_token = self.jwt_db_actions.get_token_by_id(jti)
if current_token is None:
raise self.error.not_found_error(detail="Refresh Token Not Found")
'''logout by assigning revoked flag'''
return self.jwt_db_actions.logout(jti)
if self.jwt_db_actions.logout(jti):
return True
else:
raise self.error.not_found_error(detail="Refresh Token Not Found")
@@ -186,4 +188,4 @@ class CurrentUser:
return (access_token, refresh_token)
auth=CurrentUser()
auth=CurrentUserService()
+2 -2
View File
@@ -9,7 +9,7 @@ from src.errors.http_errors.errors import Errors
from src.models.configs_read.env import env_settings
'''Hash/Check hash'''
class Hashes:
class HashService:
def __init__(self) -> None:
pass
@@ -25,7 +25,7 @@ class Hashes:
'''jwt'''
class Jwt:
class JwtService:
def __init__(self) -> None:
+18
View File
@@ -0,0 +1,18 @@
from src.database.users.crud import UsersCrudActions
from src.errors.http_errors.errors import Errors
from src.models.pydantic_models.model import UserOut
class CrudService:
def __init__(self) -> None:
self.errors=Errors()
self.crud_db_actions=UsersCrudActions()
def get_user_by_email(self, email:str)->UserOut:
user_entity=self.crud_db_actions.get_user_by_email(email)
if not user_entity:
raise self.errors.not_found_error(detail="User wasn't found")
return UserOut.model_validate(user_entity)
crud_service=CrudService()
@@ -0,0 +1,12 @@
from fastapi import APIRouter, Depends
from src.models.pydantic_models.model import UserOut
from src.service.users_crud.users_crud import crud_service
from src.web.protected_routes.routes import get_current_user
router=APIRouter(prefix="/user")
@router.get("/get_by_email")
async def get_current_user_by_email(email:str, current_user=Depends(get_current_user))->UserOut: # noqa: B008
return crud_service.get_user_by_email(email)