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 typing import Optional
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.orm import selectinload
from models import Board from models import Board
from repositories.base import BaseRepository from repositories.base import BaseRepository
@ -17,7 +18,11 @@ class BoardRepository(BaseRepository):
return list(result.scalars().all()) return list(result.scalars().all())
async def get_by_id(self, board_id: int) -> Optional[Board]: 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) result = await self.session.execute(stmt)
return result.scalar_one_or_none() return result.scalar_one_or_none()
@ -38,3 +43,13 @@ class BoardRepository(BaseRepository):
await self.session.commit() await self.session.commit()
await self.session.refresh(board) await self.session.refresh(board)
return 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, UpdateBoardResponse,
CreateBoardResponse, CreateBoardResponse,
CreateBoardRequest, CreateBoardRequest,
DeleteBoardResponse,
) )
from services import BoardService from services import BoardService
@ -50,3 +51,15 @@ async def update_board(
board_id: int = Path(alias="boardId"), board_id: int = Path(alias="boardId"),
): ):
return await BoardService(session).update_board(board_id, request) 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 pass
class DeleteBoardResponse(BaseResponse):
pass
# endregion Responses # endregion Responses

View File

@ -9,6 +9,7 @@ from schemas.board import (
UpdateBoardResponse, UpdateBoardResponse,
CreateBoardRequest, CreateBoardRequest,
CreateBoardResponse, CreateBoardResponse,
DeleteBoardResponse,
) )
@ -38,3 +39,12 @@ class BoardService:
await self.repository.update(board, request.board) await self.repository.update(board, request.board)
return UpdateBoardResponse(message="Доска успешно обновлена") 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="Доска успешно удалена")