diff --git a/main.py b/main.py index c131116..fe66520 100644 --- a/main.py +++ b/main.py @@ -20,6 +20,7 @@ app.add_middleware( routers_list = [ routes.project_router, routes.board_router, + routes.deal_router, ] for router in routers_list: app.include_router(router) diff --git a/models/board.py b/models/board.py index d8bac1b..3b5410b 100644 --- a/models/board.py +++ b/models/board.py @@ -7,7 +7,7 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship from models.base import BaseModel if TYPE_CHECKING: - from models import Project, Status + from models import Project, Status, Deal class Board(BaseModel): @@ -30,3 +30,8 @@ class Board(BaseModel): "Status", back_populates="board", ) + + deals: Mapped[list["Deal"]] = relationship( + "Deal", + back_populates="board", + ) diff --git a/models/deal.py b/models/deal.py index 46bb0b3..3338bbf 100644 --- a/models/deal.py +++ b/models/deal.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship from models.base import BaseModel if TYPE_CHECKING: - from models import Status + from models import Status, Board class Deal(BaseModel): @@ -22,3 +22,13 @@ class Deal(BaseModel): comment="Текущий статус", ) status: Mapped["Status"] = relationship(lazy="selectin") + + is_deleted: Mapped[bool] = mapped_column(default=False) + + board_id: Mapped[int] = mapped_column( + ForeignKey("boards.id"), nullable=True, server_default="1" + ) + board: Mapped["Board"] = relationship( + "Board", + back_populates="deals", + ) diff --git a/repositories/deal.py b/repositories/deal.py new file mode 100644 index 0000000..c804df4 --- /dev/null +++ b/repositories/deal.py @@ -0,0 +1,11 @@ +from sqlalchemy import select + +from models import Deal +from repositories.base import BaseRepository + + +class DealRepository(BaseRepository): + async def get_all(self, board_id: int) -> list[Deal]: + stmt = select(Deal).where(Deal.is_deleted.is_(False), Deal.board_id == board_id) + result = await self.session.execute(stmt) + return list(result.scalars().all()) diff --git a/routes/__init__.py b/routes/__init__.py index e14887b..b6072fb 100644 --- a/routes/__init__.py +++ b/routes/__init__.py @@ -1,2 +1,3 @@ from .project import project_router as project_router from .board import board_router as board_router +from .deal import deal_router as deal_router diff --git a/routes/deal.py b/routes/deal.py new file mode 100644 index 0000000..6acc0c4 --- /dev/null +++ b/routes/deal.py @@ -0,0 +1,22 @@ +from fastapi import APIRouter + +from backend.dependecies import SessionDependency +from schemas.deal import GetDealsResponse +from services.deal import DealService + +deal_router = APIRouter( + prefix="/deal", + tags=["deal"], +) + + +@deal_router.get( + "/{board_id}", + response_model=GetDealsResponse, + operation_id="get_deals", +) +async def get_deals( + session: SessionDependency, + board_id: int, +): + return await DealService(session).get_deals(board_id) diff --git a/schemas/deal.py b/schemas/deal.py new file mode 100644 index 0000000..63b028c --- /dev/null +++ b/schemas/deal.py @@ -0,0 +1,31 @@ +from schemas.base import BaseSchema + + +# region Entities + + +class BaseDealSchema(BaseSchema): + name: str + + +class DealSchema(BaseDealSchema): + id: int + lexorank: str + status_id: int + + +# endregion + +# region Requests + + +# endregion + +# region Responses + + +class GetDealsResponse(BaseSchema): + deals: list[DealSchema] + + +# endregion diff --git a/services/board.py b/services/board.py index ddaf5a5..397e286 100644 --- a/services/board.py +++ b/services/board.py @@ -9,7 +9,7 @@ class BoardService: self.repository = BoardRepository(session) async def get_boards(self, project_id: int) -> GetBoardsResponse: - projects = await self.repository.get_all(project_id) + boards = await self.repository.get_all(project_id) return GetBoardsResponse( - boards=[BoardSchema.model_validate(project) for project in projects] + boards=[BoardSchema.model_validate(board) for board in boards] ) diff --git a/services/deal.py b/services/deal.py new file mode 100644 index 0000000..e8c9e13 --- /dev/null +++ b/services/deal.py @@ -0,0 +1,15 @@ +from sqlalchemy.ext.asyncio import AsyncSession + +from repositories.deal import DealRepository +from schemas.deal import GetDealsResponse, DealSchema + + +class DealService: + def __init__(self, session: AsyncSession): + self.repository = DealRepository(session) + + async def get_deals(self, board_id: int) -> GetDealsResponse: + deals = await self.repository.get_all(board_id) + return GetDealsResponse( + deals=[DealSchema.model_validate(deal) for deal in deals] + )