feat: create and delete status endpoints

This commit is contained in:
2025-08-07 15:47:07 +04:00
parent 2fed828768
commit 3b1b6f0523
4 changed files with 100 additions and 9 deletions

View File

@ -1,10 +1,11 @@
from datetime import datetime
from typing import Optional
from sqlalchemy import select
from sqlalchemy import select, func
from models import Status
from models import Status, Deal
from repositories.base import BaseRepository
from schemas.status import UpdateStatusSchema
from schemas.status import UpdateStatusSchema, CreateStatusSchema
class StatusRepository(BaseRepository):
@ -22,6 +23,20 @@ class StatusRepository(BaseRepository):
result = await self.session.execute(stmt)
return result.scalar_one_or_none()
async def get_deals_count(self, status_id: int) -> int:
stmt = select(func.count(Deal.id)).where(Deal.status_id == status_id)
result = await self.session.execute(stmt)
return result.scalar()
async def create(self, data: CreateStatusSchema) -> Status:
status_data = data.model_dump()
status_data["created_at"] = datetime.now()
status = Status(**status_data)
self.session.add(status)
await self.session.commit()
await self.session.refresh(status)
return status
async def update(self, status: Status, data: UpdateStatusSchema) -> Status:
status.lexorank = data.lexorank if data.lexorank else status.lexorank
status.name = data.name if data.name else status.name
@ -30,3 +45,13 @@ class StatusRepository(BaseRepository):
await self.session.commit()
await self.session.refresh(status)
return status
async def delete(self, status: Status, is_soft: bool):
if not is_soft:
await self.session.delete(status)
await self.session.commit()
return
status.is_deleted = True
self.session.add(status)
await self.session.commit()

View File

@ -5,6 +5,9 @@ from schemas.status import (
UpdateStatusRequest,
UpdateStatusResponse,
GetStatusesResponse,
CreateStatusResponse,
CreateStatusRequest,
DeleteStatusResponse,
)
from services import StatusService
@ -25,6 +28,18 @@ async def get_statuses(
return await StatusService(session).get_statuses(board_id)
@status_router.post(
"/",
response_model=CreateStatusResponse,
operation_id="create_status",
)
async def create_status(
session: SessionDependency,
request: CreateStatusRequest,
):
return await StatusService(session).create_status(request)
@status_router.patch(
"/{statusId}",
response_model=UpdateStatusResponse,
@ -36,3 +51,15 @@ async def update_status(
status_id: int = Path(alias="statusId"),
):
return await StatusService(session).update_status(status_id, request)
@status_router.delete(
"/{statusId}",
response_model=DeleteStatusResponse,
operation_id="delete_status",
)
async def delete_status(
session: SessionDependency,
status_id: int = Path(alias="statusId"),
):
return await StatusService(session).delete_status(status_id)

View File

@ -6,12 +6,15 @@ from schemas.base import BaseSchema, BaseResponse
# region Entities
class BaseStatusSchema(BaseSchema):
name: str
class StatusSchema(BaseStatusSchema):
class StatusSchema(BaseSchema):
id: int
name: str
lexorank: str
class CreateStatusSchema(BaseSchema):
name: str
board_id: int
lexorank: str
@ -25,6 +28,10 @@ class UpdateStatusSchema(BaseSchema):
# region Requests
class CreateStatusRequest(BaseSchema):
status: CreateStatusSchema
class UpdateStatusRequest(BaseSchema):
status: UpdateStatusSchema
@ -38,8 +45,16 @@ class GetStatusesResponse(BaseSchema):
statuses: list[StatusSchema]
class CreateStatusResponse(BaseResponse):
status: StatusSchema
class UpdateStatusResponse(BaseResponse):
pass
class DeleteStatusResponse(BaseResponse):
pass
# endregion

View File

@ -3,7 +3,14 @@ from sqlalchemy.ext.asyncio import AsyncSession
from repositories import StatusRepository
from schemas.board import UpdateBoardResponse
from schemas.status import UpdateStatusRequest, GetStatusesResponse, StatusSchema
from schemas.status import (
UpdateStatusRequest,
GetStatusesResponse,
StatusSchema,
CreateStatusRequest,
CreateStatusResponse,
DeleteStatusResponse,
)
class StatusService:
@ -16,6 +23,13 @@ class StatusService:
statuses=[StatusSchema.model_validate(status) for status in statuses]
)
async def create_status(self, request: CreateStatusRequest) -> CreateStatusResponse:
status = await self.repository.create(request.status)
return CreateStatusResponse(
board=StatusSchema.model_validate(status),
message="Статус успешно создан",
)
async def update_status(self, status_id: int, request: UpdateStatusRequest):
status = await self.repository.get_by_id(status_id)
if not status:
@ -23,3 +37,13 @@ class StatusService:
await self.repository.update(status, request.status)
return UpdateBoardResponse(message="Статус успешно обновлен")
async def delete_status(self, status_id: int) -> DeleteStatusResponse:
board = await self.repository.get_by_id(status_id)
if not board:
raise HTTPException(status_code=404, detail="Статус не найден")
deals_count = await self.repository.get_deals_count(status_id)
is_soft_needed: bool = deals_count > 0
await self.repository.delete(board, is_soft_needed)
return DeleteStatusResponse(message="Статус успешно удален")