fixes
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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
@@ -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()
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user