integration tests
This commit is contained in:
@@ -2,8 +2,10 @@
|
||||
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
|
||||
from src.models.database_models.model import RefreshTokens, engine
|
||||
from src.models.pydantic_models.model import RefreshTokensOut
|
||||
|
||||
@@ -11,6 +13,7 @@ from src.models.pydantic_models.model import RefreshTokensOut
|
||||
class JwtCrudActions:
|
||||
def __init__(self) -> None:
|
||||
self.Session=sessionmaker(bind=engine)
|
||||
self.error=Errors()
|
||||
|
||||
def get_token_by_user_id(self, user_id:UUID)->RefreshTokensOut|None:
|
||||
with self.Session() as session: # noqa: SIM117
|
||||
@@ -45,6 +48,23 @@ class JwtCrudActions:
|
||||
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
|
||||
|
||||
|
||||
def revoke_all(self, user_id:UUID)->bool:
|
||||
with self.Session() as session: # noqa: SIM117
|
||||
|
||||
@@ -146,10 +146,8 @@ class CurrentUser:
|
||||
ip_address=request.headers.get("x-forwarded-for", "").split(",")[0].strip() or (request.client.host if request.client else "unknown"),
|
||||
expires_at=datetime.now(UTC)+timedelta(days=env_settings.REFRESH_TOKEN_EXPIRE_DAYS),
|
||||
)
|
||||
self.jwt_db_actions.create_token(RefreshTokensCreate.model_dump(new_token_record))
|
||||
|
||||
'''update old token to deactivate it and assign replaced_by'''
|
||||
self.jwt_db_actions.update_token(old_jti, new_jti)
|
||||
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)
|
||||
|
||||
|
||||
@@ -34,6 +34,8 @@ class Jwt:
|
||||
def create_access_token(self, data:dict)->str:
|
||||
|
||||
user_info=data.copy()
|
||||
if not (user_info.get("sub")) or user_info.get("sub") == "":
|
||||
raise self.error.credentials_error(detail="Jwt token is incorrect")
|
||||
user_info.update({"exp": datetime.now(UTC)+timedelta(minutes=env_settings.ACCESS_TOKEN_EXPIRE_MINUTES),
|
||||
"token_type":"access"})
|
||||
return jwt.encode(user_info, env_settings.SECRET_KEY, env_settings.ALGORITHM)
|
||||
@@ -43,6 +45,8 @@ class Jwt:
|
||||
|
||||
user_info=data.copy()
|
||||
jti=str(uuid4())
|
||||
if not (user_info.get("sub")) or user_info.get("sub") == "":
|
||||
raise self.error.credentials_error(detail="Jwt token is incorrect")
|
||||
user_info.update({"exp":datetime.now(UTC)+timedelta(days=env_settings.REFRESH_TOKEN_EXPIRE_DAYS),
|
||||
"token_type":"refresh",
|
||||
"jti":jti
|
||||
|
||||
Reference in New Issue
Block a user