mirror of
https://github.com/koloideal/DutyLog.git
synced 2026-06-10 10:25:29 +03:00
commit
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user