From e8b71a0c375d44a701de90289f7b1f5e28f8aef4 Mon Sep 17 00:00:00 2001 From: andrei Date: Mon, 2 Jun 2025 21:17:11 +0500 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8C=20Role=20=D0=B8=20=D1=81=D0=B2=D1=8F=D0=B7=D1=8C=20User-?= =?UTF-8?q?Role?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/application/users_repository.py | 6 +++++- api/app/domain/entities/role.py | 8 ++++++++ api/app/domain/entities/user.py | 4 ++++ api/app/infrastructure/users_service.py | 15 +++++++++++++-- 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 api/app/domain/entities/role.py diff --git a/api/app/application/users_repository.py b/api/app/application/users_repository.py index ccf3115..2a3ea4e 100644 --- a/api/app/application/users_repository.py +++ b/api/app/application/users_repository.py @@ -17,7 +17,11 @@ class UsersRepository: return result.scalars().all() async def get_by_id(self, user_id: int) -> Optional[User]: - stmt = select(User).filter_by(id=user_id) + stmt = ( + select(User) + .filter_by(id=user_id) + .options(joinedload(User.role)) + ) result = await self.db.execute(stmt) return result.scalars().first() diff --git a/api/app/domain/entities/role.py b/api/app/domain/entities/role.py new file mode 100644 index 0000000..ed67ceb --- /dev/null +++ b/api/app/domain/entities/role.py @@ -0,0 +1,8 @@ +from typing import Optional + +from pydantic import BaseModel + + +class RoleEntity(BaseModel): + id: Optional[int] = None + title: str diff --git a/api/app/domain/entities/user.py b/api/app/domain/entities/user.py index 0bd7e15..bdabc64 100644 --- a/api/app/domain/entities/user.py +++ b/api/app/domain/entities/user.py @@ -2,6 +2,8 @@ from typing import Optional from pydantic import BaseModel +from app.domain.entities.role import RoleEntity + class UserEntity(BaseModel): id: Optional[int] = None @@ -11,3 +13,5 @@ class UserEntity(BaseModel): login: str role_id: Optional[int] = None + + role: Optional[RoleEntity] = None diff --git a/api/app/infrastructure/users_service.py b/api/app/infrastructure/users_service.py index 8aeae32..e9df64b 100644 --- a/api/app/infrastructure/users_service.py +++ b/api/app/infrastructure/users_service.py @@ -8,8 +8,9 @@ from app.application.roles_repository import RolesRepository from app.application.users_repository import UsersRepository from app.domain.entities.change_password import ChangePasswordEntity from app.domain.entities.register import RegisterEntity +from app.domain.entities.role import RoleEntity from app.domain.entities.user import UserEntity -from app.domain.models import User +from app.domain.models import User, Role class UsersService: @@ -25,7 +26,10 @@ class UsersService: detail='User was not found', ) - return self.model_to_entity(user) + user_entity = self.model_to_entity(user) + user_entity.role = self.role_model_to_entity(user.role) + + return user_entity async def change_password(self, data: ChangePasswordEntity, current_user_id: int) -> Optional[UserEntity]: user = await self.users_repository.get_by_id(data.user_id) @@ -136,6 +140,13 @@ class UsersService: return self.model_to_entity(user_model) + @staticmethod + def role_model_to_entity(role: Role) -> RoleEntity: + return RoleEntity( + id=role.id, + title=role.title, + ) + @staticmethod def is_strong_password(password: str) -> bool: if len(password) < 8: