Initial commit

This commit is contained in:
2025-12-31 00:52:08 +03:00
parent d4898869fa
commit d7072f88fc
4 changed files with 67 additions and 17 deletions
+12
View File
@@ -1,2 +1,14 @@
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime 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
+36 -17
View File
@@ -1,6 +1,8 @@
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession 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 from trudex.infrastructure.database.models import User
@@ -8,27 +10,31 @@ class UserDAO:
def __init__(self, session: AsyncSession) -> None: def __init__(self, session: AsyncSession) -> None:
self.session: AsyncSession = session 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( result = await self.session.execute(
select(User).where(User.id == user_id) 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)) 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( result = await self.session.execute(
select(User).where(User.group == group) 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( result = await self.session.execute(
select(User).where(User.is_admin == True) 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( async def create(
self, self,
@@ -38,7 +44,7 @@ class UserDAO:
last_name: str | None = None, last_name: str | None = None,
group: int | None = None, group: int | None = None,
is_admin: bool = False, is_admin: bool = False,
) -> User: ) -> DomainUser:
user = User( user = User(
id=user_id, id=user_id,
username=username, username=username,
@@ -49,7 +55,8 @@ class UserDAO:
) )
self.session.add(user) self.session.add(user)
await self.session.flush() await self.session.flush()
return user await self.session.refresh(user)
return UserDTO(user).to_domain()
async def update( async def update(
self, self,
@@ -59,8 +66,11 @@ class UserDAO:
last_name: str | None = None, last_name: str | None = None,
group: int | None = None, group: int | None = None,
is_admin: bool | None = None, is_admin: bool | None = None,
) -> User | None: ) -> DomainUser | None:
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: if not user:
return None return None
@@ -76,10 +86,14 @@ class UserDAO:
user.is_admin = is_admin user.is_admin = is_admin
await self.session.flush() await self.session.flush()
return user await self.session.refresh(user)
return UserDTO(user).to_domain()
async def delete(self, user_id: int) -> bool: 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: if not user:
return False return False
@@ -95,8 +109,12 @@ class UserDAO:
last_name: str | None = None, last_name: str | None = None,
group: int | None = None, group: int | None = None,
is_admin: bool = False, is_admin: bool = False,
) -> User: ) -> DomainUser:
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 user: if user:
if username is not None: if username is not None:
user.username = username user.username = username
@@ -109,7 +127,8 @@ class UserDAO:
if is_admin is not None: if is_admin is not None:
user.is_admin = is_admin user.is_admin = is_admin
await self.session.flush() await self.session.flush()
return user await self.session.refresh(user)
return UserDTO(user).to_domain()
return await self.create( return await self.create(
user_id=user_id, user_id=user_id,
@@ -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,
)