-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added primary user entities and appliction layer
- Loading branch information
Showing
8 changed files
with
148 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
from .user import User | ||
|
||
__all__ = ("User",) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |