feat: patch deal endpoint

This commit is contained in:
2025-08-05 16:32:49 +04:00
parent 3e2839e725
commit 5db5f116af
4 changed files with 60 additions and 3 deletions

View File

@ -2,6 +2,7 @@ from sqlalchemy import select
from models import Deal from models import Deal
from repositories.base import BaseRepository from repositories.base import BaseRepository
from schemas.deal import UpdateDealSchema
class DealRepository(BaseRepository): class DealRepository(BaseRepository):
@ -9,3 +10,18 @@ class DealRepository(BaseRepository):
stmt = select(Deal).where(Deal.is_deleted.is_(False), Deal.board_id == board_id) stmt = select(Deal).where(Deal.is_deleted.is_(False), Deal.board_id == board_id)
result = await self.session.execute(stmt) result = await self.session.execute(stmt)
return list(result.scalars().all()) 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

View File

@ -1,7 +1,7 @@
from fastapi import APIRouter, Path from fastapi import APIRouter, Path
from backend.dependecies import SessionDependency from backend.dependecies import SessionDependency
from schemas.deal import GetDealsResponse from schemas.deal import GetDealsResponse, UpdateDealResponse, UpdateDealRequest
from services import DealService from services import DealService
deal_router = APIRouter( deal_router = APIRouter(
@ -20,3 +20,16 @@ async def get_deals(
board_id: int = Path(alias="boardId"), board_id: int = Path(alias="boardId"),
): ):
return await DealService(session).get_deals(board_id) 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)

View File

@ -1,4 +1,4 @@
from schemas.base import BaseSchema from schemas.base import BaseSchema, BaseResponse
# region Entities # region Entities
@ -14,11 +14,21 @@ class DealSchema(BaseDealSchema):
status_id: int status_id: int
class UpdateDealSchema(BaseSchema):
name: str | None = None
lexorank: str | None = None
status_id: int | None = None
# endregion # endregion
# region Requests # region Requests
class UpdateDealRequest(BaseSchema):
deal: UpdateDealSchema
# endregion # endregion
# region Responses # region Responses
@ -28,4 +38,8 @@ class GetDealsResponse(BaseSchema):
deals: list[DealSchema] deals: list[DealSchema]
class UpdateDealResponse(BaseResponse):
pass
# endregion # endregion

View File

@ -1,7 +1,13 @@
from fastapi import HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from repositories import DealRepository from repositories import DealRepository
from schemas.deal import GetDealsResponse, DealSchema from schemas.deal import (
GetDealsResponse,
DealSchema,
UpdateDealResponse,
UpdateDealRequest,
)
class DealService: class DealService:
@ -13,3 +19,11 @@ class DealService:
return GetDealsResponse( return GetDealsResponse(
deals=[DealSchema.model_validate(deal) for deal in deals] 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="Сделка успешно обновлена")