add user password hasher and depebdency

This commit is contained in:
2024-04-01 01:12:01 +03:00
parent 7eaa082b41
commit 4e6aee8c3a
22 changed files with 310 additions and 366 deletions

View File

@@ -1,4 +1,9 @@
from .user_request import UserCreateRequest
from .user_request import GetUserByEmailRequest, UserCreateRequest
from .user_response import UserDetaledResponse, UserResponse
__all__ = ("UserResponse", "UserDetaledResponse", "UserCreateRequest")
__all__ = (
"UserResponse",
"UserDetaledResponse",
"UserCreateRequest",
"GetUserByEmailRequest",
)

View File

@@ -6,3 +6,8 @@ class UserCreateRequest:
name: str
email: str
password: str
@dataclass(frozen=True)
class GetUserByEmailRequest:
email: str

View File

View File

@@ -0,0 +1,11 @@
from typing import Protocol
class PasswordHasher(Protocol):
@staticmethod
def hash_password(password: str) -> str:
raise NotImplementedError
@staticmethod
def verify_password(password: str, hashed_password: str) -> bool:
raise NotImplementedError

View File

@@ -1,15 +1,26 @@
from api.application.abstractions import UnitOfWork
from api.application.contracts.user.user_request import UserCreateRequest
from api.application.protocols.password_hasher import PasswordHasher
from api.domain.user.model import User
from api.domain.user.repository import UserRepository
class CreateUser:
def __init__(self, uow: UnitOfWork, user_repository: UserRepository) -> None:
def __init__(
self,
uow: UnitOfWork,
user_repository: UserRepository,
password_hasher: PasswordHasher,
) -> None:
self.uow = uow
self.user_repository = user_repository
self.hasher = password_hasher
async def execute(self, request: UserCreateRequest) -> None:
user = User.create(name=request.name, email=request.email, password=request.password)
user = User.create(
name=request.name,
email=request.email,
hashed_password=self.hasher.hash_password(request.password),
)
await self.user_repository.create_user(user=user)
await self.uow.commit()

View File

@@ -0,0 +1,15 @@
from api.application.abstractions import UnitOfWork
from api.application.contracts.user import GetUserByEmailRequest, UserResponse
from api.domain.user.repository import UserRepository
class GetUserByEmail:
def __init__(self, uow: UnitOfWork, user_repository: UserRepository) -> None:
self.uow = uow
self.user_repository = user_repository
async def execute(self, request: GetUserByEmailRequest) -> UserResponse | None:
user = await self.user_repository.get_user(filter={"email": request.email})
if user:
return None
return None