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 typing import Optional
from sqlalchemy import select 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 from schemas.deal import UpdateDealSchema, CreateDealSchema
class DealRepository(BaseRepository): class DealRepository(BaseRepository):
@ -22,6 +23,15 @@ class DealRepository(BaseRepository):
result = await self.session.execute(stmt) result = await self.session.execute(stmt)
return result.scalar_one_or_none() 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: async def update(self, deal: Deal, data: UpdateDealSchema) -> Deal:
deal.lexorank = data.lexorank if data.lexorank else deal.lexorank deal.lexorank = data.lexorank if data.lexorank else deal.lexorank
deal.name = data.name if data.name else deal.name deal.name = data.name if data.name else deal.name
@ -31,3 +41,13 @@ class DealRepository(BaseRepository):
await self.session.commit() await self.session.commit()
await self.session.refresh(deal) await self.session.refresh(deal)
return 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 fastapi import APIRouter, Path
from backend.dependecies import SessionDependency 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 from services import DealService
deal_router = APIRouter( deal_router = APIRouter(
@ -21,14 +28,38 @@ async def get_deals(
return await DealService(session).get_deals(board_id) 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( @deal_router.patch(
"/{dealId}", "/{pk}",
response_model=UpdateDealResponse, response_model=UpdateDealResponse,
operation_id="update_deal", operation_id="update_deal",
) )
async def update_deal( async def update_deal(
session: SessionDependency, session: SessionDependency,
request: UpdateDealRequest, 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 # region Entities
class BaseDealSchema(BaseSchema): class DealSchema(BaseSchema):
name: str
class DealSchema(BaseDealSchema):
id: int id: int
name: str
lexorank: str
status_id: int
class CreateDealSchema(BaseSchema):
name: str
board_id: int
lexorank: str lexorank: str
status_id: int status_id: int
@ -27,8 +31,12 @@ class UpdateDealSchema(BaseSchema):
# region Requests # region Requests
class CreateDealRequest(BaseSchema):
entity: CreateDealSchema
class UpdateDealRequest(BaseSchema): class UpdateDealRequest(BaseSchema):
deal: UpdateDealSchema entity: UpdateDealSchema
# endregion # endregion
@ -40,8 +48,16 @@ class GetDealsResponse(BaseSchema):
deals: list[DealSchema] deals: list[DealSchema]
class CreateDealResponse(BaseResponse):
entity: DealSchema
class UpdateDealResponse(BaseResponse): class UpdateDealResponse(BaseResponse):
pass pass
class DeleteDealResponse(BaseResponse):
pass
# endregion # endregion

View File

@ -7,6 +7,9 @@ from schemas.deal import (
DealSchema, DealSchema,
UpdateDealResponse, UpdateDealResponse,
UpdateDealRequest, UpdateDealRequest,
CreateDealRequest,
CreateDealResponse,
DeleteDealResponse,
) )
@ -20,10 +23,25 @@ class DealService:
deals=[DealSchema.model_validate(deal) for deal in deals] 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): async def update_deal(self, deal_id: int, request: UpdateDealRequest):
deal = await self.repository.get_by_id(deal_id) deal = await self.repository.get_by_id(deal_id)
if not deal: if not deal:
raise HTTPException(status_code=404, detail="Сделка не найдена") raise HTTPException(status_code=404, detail="Сделка не найдена")
await self.repository.update(deal, request.deal) await self.repository.update(deal, request.entity)
return UpdateDealResponse(message="Сделка успешно обновлена") 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="Сделка успешно удалена")