asyncio style refactoring

This commit is contained in:
2026-08-05 14:46:10 +03:00
parent 2da58c7483
commit 5ec033a21d
16 changed files with 280 additions and 237 deletions
+31 -30
View File
@@ -1,3 +1,4 @@
import asyncio
from datetime import UTC, datetime, timedelta
from uuid import UUID
@@ -21,14 +22,14 @@ class CurrentUserService:
self.jwt_db_actions=JwtCrudActions()
self.error=Errors()
def _check(self, form_data_email:str, form_data_password:str,):
async def _check(self, form_data_email:str, form_data_password:str,):
'''check user by email'''
user=self.crud_db_actions.get_user_by_email(form_data_email)
user=await self.crud_db_actions.get_user_by_email(form_data_email)
if user is None:
raise self.error.credentials_error(detail="Wrong credentials")
if not self.hash.verify_password(plain_password=form_data_password, hashed_password=user.hashed_password):
if not await asyncio.to_thread(self.hash.verify_password, plain_password=form_data_password, hashed_password=user.hashed_password):
raise self.error.credentials_error(detail="Wrong credentials")
if user.status is False:
@@ -36,7 +37,7 @@ class CurrentUserService:
return user
def _token_record_create(self, jti:UUID,user_id:UUID,token:str, request:Request)->RefreshTokensCreate:
async def _token_record_create(self, jti:UUID,user_id:UUID,token:str, request:Request)->RefreshTokensCreate:
return RefreshTokensCreate(
id=jti,
@@ -48,9 +49,9 @@ class CurrentUserService:
)
def get_current_user(self, token:str)->UserOut:
async def get_current_user(self, token:str)->UserOut:
payload=self.jwt_service.jwt_decode(token)
payload= await self.jwt_service.jwt_decode(token)
sub=payload.get("sub")
try:
@@ -61,7 +62,7 @@ class CurrentUserService:
if not (payload.get("token_type")=="access"):
raise self.error.credentials_error(detail="Jwt token type is incorrect")
user=self.crud_db_actions.get_user_by_id(sub)
user=await self.crud_db_actions.get_user_by_id(sub)
if user is None:
raise self.error.not_found_error(detail="User with this email address not found")
@@ -72,15 +73,15 @@ class CurrentUserService:
def create_access_token(self, user_id:UUID)->str:
async def create_access_token(self, user_id:UUID)->str:
'''create new access token if all the checks are successful'''
return self.jwt_service.create_access_token({"sub":str(user_id)})
return await self.jwt_service.create_access_token({"sub":str(user_id)})
def create_refresh_token(self,user_id:UUID, request:Request)->str:
async def create_refresh_token(self,user_id:UUID, request:Request)->str:
token, jti=self.jwt_service.create_refresh_token({"sub":str(user_id)})
token, jti= await self.jwt_service.create_refresh_token({"sub":str(user_id)})
try:
jti=UUID(jti)
@@ -88,18 +89,18 @@ class CurrentUserService:
raise self.error.credentials_error(detail="Jwt token is incorrect") from e
'''create new refresh token if all the checks are successful'''
token_record=self._token_record_create(jti=jti, user_id=user_id, token=token, request=request)
token_record=await self._token_record_create(jti=jti, user_id=user_id, token=token, request=request)
self.jwt_db_actions.create_token(RefreshTokensCreate.model_dump(token_record))
await self.jwt_db_actions.create_token(RefreshTokensCreate.model_dump(token_record))
return token
def refresh_token(self, refresh_token:str, request:Request)->tuple[str, str]:
async def refresh_token(self, refresh_token:str, request:Request)->tuple[str, str]:
'''decode old refresh token'''
old_refresh_token=self.jwt_service.jwt_decode(refresh_token)
old_refresh_token= await self.jwt_service.jwt_decode(refresh_token)
sub=old_refresh_token.get("sub")
if (old_jti:=old_refresh_token.get("jti")) is None:
@@ -118,7 +119,7 @@ class CurrentUserService:
raise self.error.credentials_error(detail="Jwt token type is incorrect")
old_record=self.jwt_db_actions.get_token_by_id(old_jti)
old_record=await self.jwt_db_actions.get_token_by_id(old_jti)
if old_record is None:
raise self.error.not_found_error(detail="Token not found")
@@ -131,7 +132,7 @@ class CurrentUserService:
raise self.error.credentials_error(detail="Token expired")
'''user check'''
user = self.crud_db_actions.get_user_by_id(sub)
user = await self.crud_db_actions.get_user_by_id(sub)
if user is None:
raise self.error.not_found_error(detail="User not found")
if user.status is False:
@@ -139,8 +140,8 @@ class CurrentUserService:
'''create new refresh token if all the checks are successful'''
new_refresh_token, new_jti=self.jwt_service.create_refresh_token({"sub":str(sub)})
new_access_token=self.create_access_token(user_id=sub)
new_refresh_token, new_jti= await self.jwt_service.create_refresh_token({"sub":str(sub)})
new_access_token=await self.create_access_token(user_id=sub)
try:
new_jti=UUID(new_jti)
@@ -149,9 +150,9 @@ class CurrentUserService:
'''create database record with the new token'''
new_token_record=self._token_record_create(jti=new_jti, user_id=sub, token=new_refresh_token, request=request)
new_token_record=await self._token_record_create(jti=new_jti, user_id=sub, token=new_refresh_token, request=request)
success = self.jwt_db_actions.create_and_update_token(RefreshTokensCreate.model_dump(new_token_record), old_jti, new_jti)
success = await self.jwt_db_actions.create_and_update_token(RefreshTokensCreate.model_dump(new_token_record), old_jti, new_jti)
if not success:
raise self.error.not_found_error(detail="Token not found")
@@ -160,10 +161,10 @@ class CurrentUserService:
def logout(self, refresh_token:str)->bool:
async def logout(self, refresh_token:str)->bool:
'''decode current refresh token'''
payload=self.jwt_service.jwt_decode(refresh_token)
payload=await self.jwt_service.jwt_decode(refresh_token)
if (jti:=payload.get("jti")) is None:
raise self.error.credentials_error(detail="Jwt token is incorrect")
@@ -174,23 +175,23 @@ class CurrentUserService:
raise self.error.credentials_error(detail="Jwt token is incorrect") from e
'''logout by assigning revoked flag'''
if self.jwt_db_actions.logout(jti):
if await self.jwt_db_actions.logout(jti):
return True
else:
raise self.error.not_found_error(detail="Refresh Token Not Found")
def login(self, form_data_email:str, form_data_password:str, request:Request)->tuple[str, str]:
async def login(self, form_data_email:str, form_data_password:str, request:Request)->tuple[str, str]:
'''revoke all the old refresh tokens'''
user = self._check(form_data_email, form_data_password)
self.jwt_db_actions.revoke_all(user_id=user.id)
user = await self._check(form_data_email, form_data_password)
await self.jwt_db_actions.revoke_all(user_id=user.id)
'''create access and refresh tokens'''
access_token=self.create_access_token(user_id=user.id)
refresh_token=self.create_refresh_token(user_id=user.id,request=request)
access_token=await self.create_access_token(user_id=user.id)
refresh_token=await self.create_refresh_token(user_id=user.id,request=request)
return (access_token, refresh_token)
def auth_service()->CurrentUserService:
async def auth_service()->CurrentUserService:
return CurrentUserService()