diff --git a/repositories/board.py b/repositories/board.py index a97378c..c146b37 100644 --- a/repositories/board.py +++ b/repositories/board.py @@ -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() diff --git a/routers/board.py b/routers/board.py index 7711ea8..d139fa4 100644 --- a/routers/board.py +++ b/routers/board.py @@ -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) diff --git a/schemas/board.py b/schemas/board.py index af50366..6eab509 100644 --- a/schemas/board.py +++ b/schemas/board.py @@ -53,4 +53,8 @@ class UpdateBoardResponse(BaseResponse): pass +class DeleteBoardResponse(BaseResponse): + pass + + # endregion Responses diff --git a/services/board.py b/services/board.py index eeb266a..05fa8e9 100644 --- a/services/board.py +++ b/services/board.py @@ -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="Доска успешно удалена")