feat: board deletion endpoint

This commit is contained in:
2025-08-07 10:12:54 +04:00
parent 734099165b
commit 2fed828768
4 changed files with 43 additions and 1 deletions

View File

@ -2,6 +2,7 @@ from datetime import datetime
from typing import Optional
from sqlalchemy import select
from sqlalchemy.orm import selectinload
from models import Board
from repositories.base import BaseRepository
@ -17,7 +18,11 @@ class BoardRepository(BaseRepository):
return list(result.scalars().all())
async def get_by_id(self, board_id: int) -> Optional[Board]:
stmt = select(Board).where(Board.id == board_id, Board.is_deleted.is_(False))
stmt = (
select(Board)
.where(Board.id == board_id, Board.is_deleted.is_(False))
.options(selectinload(Board.deals))
)
result = await self.session.execute(stmt)
return result.scalar_one_or_none()
@ -38,3 +43,13 @@ class BoardRepository(BaseRepository):
await self.session.commit()
await self.session.refresh(board)
return board
async def delete(self, board: Board, is_soft: bool):
if not is_soft:
await self.session.delete(board)
await self.session.commit()
return
board.is_deleted = True
self.session.add(board)
await self.session.commit()

View File

@ -7,6 +7,7 @@ from schemas.board import (
UpdateBoardResponse,
CreateBoardResponse,
CreateBoardRequest,
DeleteBoardResponse,
)
from services import BoardService
@ -50,3 +51,15 @@ async def update_board(
board_id: int = Path(alias="boardId"),
):
return await BoardService(session).update_board(board_id, request)
@board_router.delete(
"/{boardId}",
response_model=DeleteBoardResponse,
operation_id="delete_board",
)
async def delete_board(
session: SessionDependency,
board_id: int = Path(alias="boardId"),
):
return await BoardService(session).delete_board(board_id)

View File

@ -53,4 +53,8 @@ class UpdateBoardResponse(BaseResponse):
pass
class DeleteBoardResponse(BaseResponse):
pass
# endregion Responses

View File

@ -9,6 +9,7 @@ from schemas.board import (
UpdateBoardResponse,
CreateBoardRequest,
CreateBoardResponse,
DeleteBoardResponse,
)
@ -38,3 +39,12 @@ class BoardService:
await self.repository.update(board, request.board)
return UpdateBoardResponse(message="Доска успешно обновлена")
async def delete_board(self, board_id: int) -> DeleteBoardResponse:
board = await self.repository.get_by_id(board_id)
if not board:
raise HTTPException(status_code=404, detail="Доска не найдена")
is_soft_needed: bool = len(board.deals) > 0
await self.repository.delete(board, is_soft_needed)
return DeleteBoardResponse(message="Доска успешно удалена")