This commit is contained in:
2026-02-28 09:48:37 +03:00
parent c57a40b09a
commit 44182955aa
15 changed files with 414 additions and 21 deletions
@@ -0,0 +1,44 @@
from sqlalchemy import select, update, delete
from sqlalchemy.ext.asyncio import AsyncSession
from dutylog.infrastructure.database.models.floor import Floor
class FloorsDAO:
def __init__(self, session: AsyncSession):
self.session = session
async def get_by_id(self, floor_id: int) -> Floor | None:
result = await self.session.execute(
select(Floor).where(Floor.id == floor_id)
)
return result.scalar_one_or_none()
async def get_by_number(self, number: int) -> Floor | None:
result = await self.session.execute(
select(Floor).where(Floor.number == number)
)
return result.scalar_one_or_none()
async def get_all(self) -> list[Floor]:
result = await self.session.execute(select(Floor))
return list(result.scalars().all())
async def create(self, floor: Floor) -> Floor:
self.session.add(floor)
await self.session.commit()
await self.session.refresh(floor)
return floor
async def update(self, floor_id: int, **kwargs) -> Floor | None:
await self.session.execute(
update(Floor).where(Floor.id == floor_id).values(**kwargs)
)
await self.session.commit()
return await self.get_by_id(floor_id)
async def delete(self, floor_id: int) -> None:
await self.session.execute(
delete(Floor).where(Floor.id == floor_id)
)
await self.session.commit()
@@ -20,6 +20,12 @@ class RoomsDAO:
)
return result.scalar_one_or_none()
async def get_by_floor(self, floor_id: int) -> list[Room]:
result = await self.session.execute(
select(Room).where(Room.on_floor == floor_id)
)
return list(result.scalars().all())
async def get_all(self) -> list[Room]:
result = await self.session.execute(select(Room))
return list(result.scalars().all())
@@ -3,5 +3,6 @@ from dutylog.infrastructure.database.models.user import User
from dutylog.infrastructure.database.models.hours_transaction import HoursTransaction
from dutylog.infrastructure.database.models.room import Room
from dutylog.infrastructure.database.models.resident import Resident
from dutylog.infrastructure.database.models.floor import Floor
__all__ = ["Base", "User", "HoursTransaction", "Room", "Resident"]
__all__ = ["Base", "User", "HoursTransaction", "Room", "Resident", "Floor"]
@@ -0,0 +1,11 @@
from sqlalchemy import Integer
from sqlalchemy.orm import Mapped, mapped_column
from dutylog.infrastructure.database.models.base import Base
class Floor(Base):
__tablename__ = "floors"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
number: Mapped[int] = mapped_column(Integer, nullable=False, unique=True)
@@ -1,4 +1,4 @@
from sqlalchemy import Integer
from sqlalchemy import Integer, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column
from dutylog.infrastructure.database.models.base import Base
@@ -9,3 +9,4 @@ class Room(Base):
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
number: Mapped[int] = mapped_column(Integer, nullable=False, unique=True)
on_floor: Mapped[int] = mapped_column(Integer, ForeignKey("floors.id", ondelete="CASCADE"), nullable=False)
@@ -0,0 +1,26 @@
from dutylog.infrastructure.database.dao.floors_dao import FloorsDAO
from dutylog.infrastructure.database.models.floor import Floor
class FloorsRepository:
def __init__(self, floors_dao: FloorsDAO):
self.floors_dao = floors_dao
async def get_or_create_floor(self, number: int) -> Floor:
floor = await self.floors_dao.get_by_number(number)
if not floor:
floor = Floor(number=number)
floor = await self.floors_dao.create(floor)
return floor
async def get_floor_by_id(self, floor_id: int) -> Floor | None:
return await self.floors_dao.get_by_id(floor_id)
async def get_floor_by_number(self, number: int) -> Floor | None:
return await self.floors_dao.get_by_number(number)
async def get_all_floors(self) -> list[Floor]:
return await self.floors_dao.get_all()
async def delete_floor(self, floor_id: int) -> None:
await self.floors_dao.delete(floor_id)
@@ -6,12 +6,9 @@ class RoomsRepository:
def __init__(self, rooms_dao: RoomsDAO):
self.rooms_dao = rooms_dao
async def get_or_create_room(self, number: int) -> Room:
room = await self.rooms_dao.get_by_number(number)
if not room:
room = Room(number=number)
room = await self.rooms_dao.create(room)
return room
async def create_room(self, number: int, floor_id: int) -> Room:
room = Room(number=number, on_floor=floor_id)
return await self.rooms_dao.create(room)
async def get_room_by_id(self, room_id: int) -> Room | None:
return await self.rooms_dao.get_by_id(room_id)
@@ -19,6 +16,9 @@ class RoomsRepository:
async def get_room_by_number(self, number: int) -> Room | None:
return await self.rooms_dao.get_by_number(number)
async def get_rooms_by_floor(self, floor_id: int) -> list[Room]:
return await self.rooms_dao.get_by_floor(floor_id)
async def get_all_rooms(self) -> list[Room]:
return await self.rooms_dao.get_all()
+11
View File
@@ -8,10 +8,12 @@ from dutylog.infrastructure.database.dao.users_dao import UsersDAO
from dutylog.infrastructure.database.dao.hours_transactions_dao import HoursTransactionsDAO
from dutylog.infrastructure.database.dao.rooms_dao import RoomsDAO
from dutylog.infrastructure.database.dao.residents_dao import ResidentsDAO
from dutylog.infrastructure.database.dao.floors_dao import FloorsDAO
from dutylog.infrastructure.database.repositories.users_repository import UsersRepository
from dutylog.infrastructure.database.repositories.hours_transactions_repository import HoursTransactionsRepository
from dutylog.infrastructure.database.repositories.rooms_repository import RoomsRepository
from dutylog.infrastructure.database.repositories.residents_repository import ResidentsRepository
from dutylog.infrastructure.database.repositories.floors_repository import FloorsRepository
from dutylog.infrastructure.utils.config import Config, load_config
@@ -55,6 +57,10 @@ class DAOProvider(Provider):
def get_residents_dao(self, session: AsyncSession) -> ResidentsDAO:
return ResidentsDAO(session)
@provide(scope=Scope.REQUEST)
def get_floors_dao(self, session: AsyncSession) -> FloorsDAO:
return FloorsDAO(session)
class RepositoryProvider(Provider):
@provide(scope=Scope.REQUEST)
@@ -77,6 +83,11 @@ class RepositoryProvider(Provider):
def get_residents_repository(self, residents_dao: ResidentsDAO) -> ResidentsRepository:
return ResidentsRepository(residents_dao)
@provide(scope=Scope.REQUEST)
def get_floors_repository(self, floors_dao: FloorsDAO) -> FloorsRepository:
return FloorsRepository(floors_dao)