feat: get deals endpoint

This commit is contained in:
2025-08-03 16:53:32 +04:00
parent ff147f93b1
commit 3c8655798f
9 changed files with 100 additions and 4 deletions

View File

@ -20,6 +20,7 @@ app.add_middleware(
routers_list = [ routers_list = [
routes.project_router, routes.project_router,
routes.board_router, routes.board_router,
routes.deal_router,
] ]
for router in routers_list: for router in routers_list:
app.include_router(router) app.include_router(router)

View File

@ -7,7 +7,7 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship
from models.base import BaseModel from models.base import BaseModel
if TYPE_CHECKING: if TYPE_CHECKING:
from models import Project, Status from models import Project, Status, Deal
class Board(BaseModel): class Board(BaseModel):
@ -30,3 +30,8 @@ class Board(BaseModel):
"Status", "Status",
back_populates="board", back_populates="board",
) )
deals: Mapped[list["Deal"]] = relationship(
"Deal",
back_populates="board",
)

View File

@ -6,7 +6,7 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship
from models.base import BaseModel from models.base import BaseModel
if TYPE_CHECKING: if TYPE_CHECKING:
from models import Status from models import Status, Board
class Deal(BaseModel): class Deal(BaseModel):
@ -22,3 +22,13 @@ class Deal(BaseModel):
comment="Текущий статус", comment="Текущий статус",
) )
status: Mapped["Status"] = relationship(lazy="selectin") 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",
)

11
repositories/deal.py Normal file
View File

@ -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())

View File

@ -1,2 +1,3 @@
from .project import project_router as project_router from .project import project_router as project_router
from .board import board_router as board_router from .board import board_router as board_router
from .deal import deal_router as deal_router

22
routes/deal.py Normal file
View File

@ -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)

31
schemas/deal.py Normal file
View File

@ -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

View File

@ -9,7 +9,7 @@ class BoardService:
self.repository = BoardRepository(session) self.repository = BoardRepository(session)
async def get_boards(self, project_id: int) -> GetBoardsResponse: 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( return GetBoardsResponse(
boards=[BoardSchema.model_validate(project) for project in projects] boards=[BoardSchema.model_validate(board) for board in boards]
) )

15
services/deal.py Normal file
View File

@ -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]
)