diff --git a/repositories/deal.py b/repositories/deal.py index 59fa9a6..54a076d 100644 --- a/repositories/deal.py +++ b/repositories/deal.py @@ -1,10 +1,11 @@ +from datetime import datetime from typing import Optional from sqlalchemy import select from models import Deal from repositories.base import BaseRepository -from schemas.deal import UpdateDealSchema +from schemas.deal import UpdateDealSchema, CreateDealSchema class DealRepository(BaseRepository): @@ -22,6 +23,15 @@ class DealRepository(BaseRepository): result = await self.session.execute(stmt) return result.scalar_one_or_none() + async def create(self, data: CreateDealSchema) -> Deal: + deal_data = data.model_dump() + deal_data["created_at"] = datetime.now() + deal = Deal(**deal_data) + self.session.add(deal) + await self.session.commit() + await self.session.refresh(deal) + return deal + 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 @@ -31,3 +41,13 @@ class DealRepository(BaseRepository): await self.session.commit() await self.session.refresh(deal) return deal + + async def delete(self, deal: Deal, is_soft: bool): + if not is_soft: + await self.session.delete(deal) + await self.session.commit() + return + + deal.is_deleted = True + self.session.add(deal) + await self.session.commit() diff --git a/routers/deal.py b/routers/deal.py index 99e8e59..5184ffb 100644 --- a/routers/deal.py +++ b/routers/deal.py @@ -1,7 +1,14 @@ from fastapi import APIRouter, Path from backend.dependecies import SessionDependency -from schemas.deal import GetDealsResponse, UpdateDealResponse, UpdateDealRequest +from schemas.deal import ( + GetDealsResponse, + UpdateDealResponse, + UpdateDealRequest, + CreateDealResponse, + CreateDealRequest, + DeleteDealResponse, +) from services import DealService deal_router = APIRouter( @@ -21,14 +28,38 @@ async def get_deals( return await DealService(session).get_deals(board_id) +@deal_router.post( + "/", + response_model=CreateDealResponse, + operation_id="create_deal", +) +async def create_deal( + session: SessionDependency, + request: CreateDealRequest, +): + return await DealService(session).create_deal(request) + + @deal_router.patch( - "/{dealId}", + "/{pk}", response_model=UpdateDealResponse, operation_id="update_deal", ) async def update_deal( session: SessionDependency, request: UpdateDealRequest, - deal_id: int = Path(alias="dealId"), + pk: int = Path(), ): - return await DealService(session).update_deal(deal_id, request) + return await DealService(session).update_deal(pk, request) + + +@deal_router.delete( + "/{pk}", + response_model=DeleteDealResponse, + operation_id="delete_deal", +) +async def delete_deal( + session: SessionDependency, + pk: int = Path(), +): + return await DealService(session).delete_deal(pk) diff --git a/schemas/deal.py b/schemas/deal.py index 522c04c..ab83de6 100644 --- a/schemas/deal.py +++ b/schemas/deal.py @@ -6,12 +6,16 @@ from schemas.base import BaseSchema, BaseResponse # region Entities -class BaseDealSchema(BaseSchema): - name: str - - -class DealSchema(BaseDealSchema): +class DealSchema(BaseSchema): id: int + name: str + lexorank: str + status_id: int + + +class CreateDealSchema(BaseSchema): + name: str + board_id: int lexorank: str status_id: int @@ -27,8 +31,12 @@ class UpdateDealSchema(BaseSchema): # region Requests +class CreateDealRequest(BaseSchema): + entity: CreateDealSchema + + class UpdateDealRequest(BaseSchema): - deal: UpdateDealSchema + entity: UpdateDealSchema # endregion @@ -40,8 +48,16 @@ class GetDealsResponse(BaseSchema): deals: list[DealSchema] +class CreateDealResponse(BaseResponse): + entity: DealSchema + + class UpdateDealResponse(BaseResponse): pass +class DeleteDealResponse(BaseResponse): + pass + + # endregion diff --git a/services/deal.py b/services/deal.py index 2a427d4..59c5ef4 100644 --- a/services/deal.py +++ b/services/deal.py @@ -7,6 +7,9 @@ from schemas.deal import ( DealSchema, UpdateDealResponse, UpdateDealRequest, + CreateDealRequest, + CreateDealResponse, + DeleteDealResponse, ) @@ -20,10 +23,25 @@ class DealService: deals=[DealSchema.model_validate(deal) for deal in deals] ) + async def create_deal(self, request: CreateDealRequest) -> CreateDealResponse: + deal = await self.repository.create(request.entity) + return CreateDealResponse( + entity=DealSchema.model_validate(deal), + message="Сделка успешно создана", + ) + 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) + await self.repository.update(deal, request.entity) return UpdateDealResponse(message="Сделка успешно обновлена") + + async def delete_deal(self, deal_id: int) -> DeleteDealResponse: + deal = await self.repository.get_by_id(deal_id) + if not deal: + raise HTTPException(status_code=404, detail="Сделка не найдена") + + await self.repository.delete(deal, False) + return DeleteDealResponse(message="Сделка успешно удалена")