Skip to content

Commit

Permalink
Added primary user entities and appliction layer
Browse files Browse the repository at this point in the history
  • Loading branch information
Fan4ik20 committed Sep 8, 2023
1 parent 825c327 commit a874bfb
Show file tree
Hide file tree
Showing 8 changed files with 148 additions and 0 deletions.
3 changes: 3 additions & 0 deletions app/core/domain/entities/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from .user import User

__all__ = ("User",)
11 changes: 11 additions & 0 deletions app/core/domain/entities/user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from dataclasses import dataclass

__all__ = ("User",)


@dataclass
class User:
username: str
email: str
password_hash: str
id: int = -1
4 changes: 4 additions & 0 deletions app/core/services/user/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from .dto import User, UserCreate, UserModel, UserUpdate
from .interfaces import UserRepository

__all__ = ("UserRepository", "User", "UserModel", "UserCreate", "UserUpdate")
55 changes: 55 additions & 0 deletions app/core/services/user/application.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from core.domain import entities
from core.services.user import dto, exc, mappers
from core.services.user.interfaces import UserRepository


class UserService:
def __init__(self, repo: UserRepository) -> None:
self._repo = repo

def create_user(self, user: dto.UserCreate) -> dto.UserModel:
if self._repo.get_user_by_email(user.email) is None:
raise exc.UserAlreadyExists("email")
if self._repo.get_user_by_username(user.username) is None:
raise exc.UserAlreadyExists("username")

domain = self._repo.create_user(mappers.map_dto_to_domain(user))

return mappers.map_domain_to_model(domain)

def get_user(
self,
id_: int | None = None,
username: str | None = None,
email: str | None = None,
) -> dto.UserModel:
if id_:
user = self._repo.get_user_by_id(id_)
elif username:
user = self._repo.get_user_by_username(username)
elif email:
user = self._repo.get_user_by_email(email)
else:
raise ValueError("You need to provide at least 1 argument")

return mappers.map_domain_to_model(user)

def _hash_psw(self, psw: str) -> str:
return ""

def _update_domain(
self, user_domain: entities.User, user_dto: dto.UserUpdate
) -> None:
if user_dto.email:
user_domain.email = user_dto.email
if user_dto.username:
user_domain.username = user_dto.username
if user_dto.password:
user_domain.password_hash = self._hash_psw(user_dto.password)

def update_user(self, id_: int, user: dto.UserUpdate) -> dto.UserModel:
domain = self._repo.get_user_by_id(id_)

self._update_domain(domain, user)

return mappers.map_domain_to_model(self._repo.update_user(domain))
34 changes: 34 additions & 0 deletions app/core/services/user/dto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from dataclasses import dataclass

__all__ = (
"User",
"UserModel",
"UserCreate",
"UserUpdate",
)


@dataclass
class UserCreate:
username: str
email: str
password: str


@dataclass
class UserUpdate:
username: str | None = None
email: str | None = None
password: str | None = None


@dataclass
class User:
username: str
email: str


@dataclass
class UserModel:
id: int
user: User
5 changes: 5 additions & 0 deletions app/core/services/user/exc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class UserAlreadyExists(Exception):
def __init__(self, attr: str) -> None:
self.attr = attr

super().__init__(f"User with given {self.attr} already exist")
20 changes: 20 additions & 0 deletions app/core/services/user/interfaces.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from typing import Protocol

from core.domain import entities


class UserRepository(Protocol):
def get_user_by_id(self, id_: int) -> entities.User:
raise NotImplementedError

def get_user_by_email(self, email: str) -> entities.User:
raise NotImplementedError

def get_user_by_username(self, username: str) -> entities.User:
raise NotImplementedError

def create_user(self, user: entities.User) -> entities.User:
raise NotImplementedError

def update_user(self, user: entities.User) -> entities.User:
raise NotImplementedError
16 changes: 16 additions & 0 deletions app/core/services/user/mappers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from core.domain import entities
from core.services.user import dto


def map_dto_to_domain(user: dto.UserCreate) -> entities.User:
return entities.User(
username=user.username,
email=user.username,
password_hash=user.password,
)


def map_domain_to_model(user: entities.User) -> dto.UserModel:
user_dto = dto.User(username=user.username, email=user.email)

return dto.UserModel(id=user.id, user=user_dto)

0 comments on commit a874bfb

Please sign in to comment.