diff --git a/repositories/deal.py b/repositories/deal.py index c804df4..f0904df 100644 --- a/repositories/deal.py +++ b/repositories/deal.py @@ -2,6 +2,7 @@ from sqlalchemy import select from models import Deal from repositories.base import BaseRepository +from schemas.deal import UpdateDealSchema class DealRepository(BaseRepository): @@ -9,3 +10,18 @@ class DealRepository(BaseRepository): 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()) + + async def get_by_id(self, deal_id: int) -> Deal | None: + stmt = select(Deal).where(Deal.id == deal_id, Deal.is_deleted.is_(False)) + result = await self.session.execute(stmt) + return result.scalar_one_or_none() + + async def update(self, deal: Deal, data: UpdateDealSchema) -> Deal: + deal.lexorank = data.lexorank if data.lexorank else deal.lexorank + deal.name = data.name if data.name else deal.name + deal.status_id = data.status_id if data.status_id else deal.status_id + + self.session.add(deal) + await self.session.commit() + await self.session.refresh(deal) + return deal diff --git a/routes/deal.py b/routes/deal.py index 72f2422..ea8c930 100644 --- a/routes/deal.py +++ b/routes/deal.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Path from backend.dependecies import SessionDependency -from schemas.deal import GetDealsResponse +from schemas.deal import GetDealsResponse, UpdateDealResponse, UpdateDealRequest from services import DealService deal_router = APIRouter( @@ -20,3 +20,16 @@ async def get_deals( board_id: int = Path(alias="boardId"), ): return await DealService(session).get_deals(board_id) + + +@deal_router.patch( + "/{dealId}", + response_model=UpdateDealResponse, + operation_id="update_deal", +) +async def update_deal( + session: SessionDependency, + request: UpdateDealRequest, + deal_id: int = Path(alias="dealId"), +): + return await DealService(session).update_deal(deal_id, request) diff --git a/schemas/deal.py b/schemas/deal.py index 63b028c..f715d71 100644 --- a/schemas/deal.py +++ b/schemas/deal.py @@ -1,4 +1,4 @@ -from schemas.base import BaseSchema +from schemas.base import BaseSchema, BaseResponse # region Entities @@ -14,11 +14,21 @@ class DealSchema(BaseDealSchema): status_id: int +class UpdateDealSchema(BaseSchema): + name: str | None = None + lexorank: str | None = None + status_id: int | None = None + + # endregion # region Requests +class UpdateDealRequest(BaseSchema): + deal: UpdateDealSchema + + # endregion # region Responses @@ -28,4 +38,8 @@ class GetDealsResponse(BaseSchema): deals: list[DealSchema] +class UpdateDealResponse(BaseResponse): + pass + + # endregion diff --git a/services/deal.py b/services/deal.py index 5df5379..2a427d4 100644 --- a/services/deal.py +++ b/services/deal.py @@ -1,7 +1,13 @@ +from fastapi import HTTPException from sqlalchemy.ext.asyncio import AsyncSession from repositories import DealRepository -from schemas.deal import GetDealsResponse, DealSchema +from schemas.deal import ( + GetDealsResponse, + DealSchema, + UpdateDealResponse, + UpdateDealRequest, +) class DealService: @@ -13,3 +19,11 @@ class DealService: return GetDealsResponse( deals=[DealSchema.model_validate(deal) for deal in deals] ) + + async def update_deal(self, deal_id: int, request: UpdateDealRequest): + deal = await self.repository.get_by_id(deal_id) + if not deal: + raise HTTPException(status_code=404, detail="Сделка не найдена") + + await self.repository.update(deal, request.deal) + return UpdateDealResponse(message="Сделка успешно обновлена")