auth next part

This commit is contained in:
2024-04-02 22:33:15 +03:00
parent 949ea9fdcf
commit b04eba9bc4
22 changed files with 298 additions and 29 deletions

View File

@@ -1,3 +1,3 @@
from .auth_request import UserCreateRequest
from .auth_request import LoginRequest, UserCreateRequest
__all__ = ("UserCreateRequest",)
__all__ = ("UserCreateRequest", "LoginRequest")

View File

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

View File

@@ -0,0 +1,9 @@
from dataclasses import dataclass
from uuid import UUID
@dataclass(frozen=True)
class AuthenticationResponse:
id: UUID
name: str
email: str

View File

@@ -0,0 +1,7 @@
from datetime import datetime
from typing import Protocol
class DateTimeProvider(Protocol):
def get_current_time(self) -> datetime:
raise NotImplementedError

View File

@@ -0,0 +1,11 @@
from typing import Protocol
from api.domain.user.model import UserId
class JwtTokenProcessor(Protocol):
def generate_token(self, user_id: UserId) -> str:
raise NotImplementedError
def validate_token(self, token: str) -> UserId | None:
raise NotImplementedError

View File

@@ -0,0 +1,30 @@
from api.application.contracts.auth.auth_request import LoginRequest
from api.application.contracts.auth.auth_response import AuthenticationResponse
from api.application.protocols.password_hasher import PasswordHasher
from api.domain.user.error import UserInvalidCredentialsError
from api.domain.user.repository import UserRepository
class LoginUser:
def __init__(
self,
user_repository: UserRepository,
password_hasher: PasswordHasher,
) -> None:
self.user_repository = user_repository
self.hasher = password_hasher
async def __call__(self, request: LoginRequest) -> AuthenticationResponse:
user = await self.user_repository.get_user(filter={"email": request.email})
error = UserInvalidCredentialsError("Email or password is incorrect")
if user is None:
raise error
if not self.hasher.verify_password(request.password, user.hashed_password):
raise error
return AuthenticationResponse(
id=user.id.value,
name=user.name.value,
email=user.email.value,
)