From d7072f88fc39c64a0128f9233c6998ad96fef7de Mon Sep 17 00:00:00 2001 From: kolo Date: Wed, 31 Dec 2025 00:52:08 +0300 Subject: [PATCH] Initial commit --- src/trudex/domain/schemas.py | 12 +++++ .../infrastructure/database/dao/user.py | 53 +++++++++++++------ .../infrastructure/database/dto/__init__.py | 0 .../infrastructure/database/dto/user.py | 19 +++++++ 4 files changed, 67 insertions(+), 17 deletions(-) create mode 100644 src/trudex/infrastructure/database/dto/__init__.py create mode 100644 src/trudex/infrastructure/database/dto/user.py diff --git a/src/trudex/domain/schemas.py b/src/trudex/domain/schemas.py index 3204566..cc4d8d7 100644 --- a/src/trudex/domain/schemas.py +++ b/src/trudex/domain/schemas.py @@ -1,2 +1,14 @@ from dataclasses import dataclass from datetime import datetime + + +@dataclass +class User: + id: int + first_name: str + username: str | None = None + last_name: str | None = None + group: int | None = None + is_admin: bool = False + created_at: datetime | None = None + updated_at: datetime | None = None diff --git a/src/trudex/infrastructure/database/dao/user.py b/src/trudex/infrastructure/database/dao/user.py index 0606151..25c08b2 100644 --- a/src/trudex/infrastructure/database/dao/user.py +++ b/src/trudex/infrastructure/database/dao/user.py @@ -1,6 +1,8 @@ from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession +from trudex.domain.schemas import User as DomainUser +from trudex.infrastructure.database.dto.user import UserDTO from trudex.infrastructure.database.models import User @@ -8,27 +10,31 @@ class UserDAO: def __init__(self, session: AsyncSession) -> None: self.session: AsyncSession = session - async def get_by_id(self, user_id: int) -> User | None: + async def get_by_id(self, user_id: int) -> DomainUser | None: result = await self.session.execute( select(User).where(User.id == user_id) ) - return result.scalar_one_or_none() + model = result.scalar_one_or_none() + return UserDTO(model).to_domain() if model else None - async def get_all(self) -> list[User]: + async def get_all(self) -> list[DomainUser]: result = await self.session.execute(select(User)) - return list(result.scalars().all()) + models = list(result.scalars().all()) + return [UserDTO(model).to_domain() for model in models] - async def get_by_group(self, group: int) -> list[User]: + async def get_by_group(self, group: int) -> list[DomainUser]: result = await self.session.execute( select(User).where(User.group == group) ) - return list(result.scalars().all()) + models = list(result.scalars().all()) + return [UserDTO(model).to_domain() for model in models] - async def get_admins(self) -> list[User]: + async def get_admins(self) -> list[DomainUser]: result = await self.session.execute( select(User).where(User.is_admin == True) ) - return list(result.scalars().all()) + models = list(result.scalars().all()) + return [UserDTO(model).to_domain() for model in models] async def create( self, @@ -38,7 +44,7 @@ class UserDAO: last_name: str | None = None, group: int | None = None, is_admin: bool = False, - ) -> User: + ) -> DomainUser: user = User( id=user_id, username=username, @@ -49,7 +55,8 @@ class UserDAO: ) self.session.add(user) await self.session.flush() - return user + await self.session.refresh(user) + return UserDTO(user).to_domain() async def update( self, @@ -59,8 +66,11 @@ class UserDAO: last_name: str | None = None, group: int | None = None, is_admin: bool | None = None, - ) -> User | None: - user = await self.get_by_id(user_id) + ) -> DomainUser | None: + result = await self.session.execute( + select(User).where(User.id == user_id) + ) + user = result.scalar_one_or_none() if not user: return None @@ -76,10 +86,14 @@ class UserDAO: user.is_admin = is_admin await self.session.flush() - return user + await self.session.refresh(user) + return UserDTO(user).to_domain() async def delete(self, user_id: int) -> bool: - user = await self.get_by_id(user_id) + result = await self.session.execute( + select(User).where(User.id == user_id) + ) + user = result.scalar_one_or_none() if not user: return False @@ -95,8 +109,12 @@ class UserDAO: last_name: str | None = None, group: int | None = None, is_admin: bool = False, - ) -> User: - user = await self.get_by_id(user_id) + ) -> DomainUser: + result = await self.session.execute( + select(User).where(User.id == user_id) + ) + user = result.scalar_one_or_none() + if user: if username is not None: user.username = username @@ -109,7 +127,8 @@ class UserDAO: if is_admin is not None: user.is_admin = is_admin await self.session.flush() - return user + await self.session.refresh(user) + return UserDTO(user).to_domain() return await self.create( user_id=user_id, diff --git a/src/trudex/infrastructure/database/dto/__init__.py b/src/trudex/infrastructure/database/dto/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/trudex/infrastructure/database/dto/user.py b/src/trudex/infrastructure/database/dto/user.py new file mode 100644 index 0000000..5e69349 --- /dev/null +++ b/src/trudex/infrastructure/database/dto/user.py @@ -0,0 +1,19 @@ +from trudex.domain.schemas import User as DomainUser +from trudex.infrastructure.database.models import User as UserModel + + +class UserDTO: + def __init__(self, model: UserModel) -> None: + self.model: UserModel = model + + def to_domain(self) -> DomainUser: + return DomainUser( + id=self.model.id, + username=self.model.username, + first_name=self.model.first_name, + last_name=self.model.last_name, + group=self.model.group, + is_admin=self.model.is_admin, + created_at=self.model.created_at, + updated_at=self.model.updated_at, + )