feat: deals create, update, delete

This commit is contained in:
2025-08-24 12:51:16 +04:00
parent c862544ae0
commit dd1f4145ae
4 changed files with 97 additions and 12 deletions

View File

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

View File

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

View File

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

View File

@ -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="Сделка успешно удалена")