From 4cbb3409b226f30d24782ee2388f81460d01d1df Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Mon, 4 Aug 2025 16:59:30 +0400 Subject: [PATCH] feat: patch board and path parameters names converting --- repositories/board.py | 15 +++++++++++++++ routes/board.py | 21 +++++++++++++++++---- routes/deal.py | 6 +++--- schemas/base.py | 4 ++++ schemas/board.py | 14 +++++++++++++- services/board.py | 16 +++++++++++++++- 6 files changed, 67 insertions(+), 9 deletions(-) diff --git a/repositories/board.py b/repositories/board.py index dd5af90..e07e065 100644 --- a/repositories/board.py +++ b/repositories/board.py @@ -3,6 +3,7 @@ from sqlalchemy.orm import selectinload from models import Board from repositories.base import BaseRepository +from schemas.board import UpdateBoardSchema class BoardRepository(BaseRepository): @@ -14,3 +15,17 @@ class BoardRepository(BaseRepository): ) result = await self.session.execute(stmt) return list(result.scalars().all()) + + async def get_by_id(self, board_id: int) -> Board | None: + stmt = select(Board).where(Board.id == board_id, Board.is_deleted.is_(False)) + result = await self.session.execute(stmt) + return result.scalar_one_or_none() + + async def update(self, board: Board, data: UpdateBoardSchema) -> Board: + board.lexorank = data.lexorank if data.lexorank else board.lexorank + board.name = data.name if data.name else board.name + + self.session.add(board) + await self.session.commit() + await self.session.refresh(board) + return board diff --git a/routes/board.py b/routes/board.py index a0197a1..aef8d2a 100644 --- a/routes/board.py +++ b/routes/board.py @@ -1,7 +1,7 @@ -from fastapi import APIRouter +from fastapi import APIRouter, Path from backend.dependecies import SessionDependency -from schemas.board import GetBoardsResponse +from schemas.board import GetBoardsResponse, UpdateBoardRequest, UpdateBoardResponse from services.board import BoardService board_router = APIRouter( @@ -11,12 +11,25 @@ board_router = APIRouter( @board_router.get( - "/{project_id}", + "/{projectId}", response_model=GetBoardsResponse, operation_id="get_boards", ) async def get_boards( session: SessionDependency, - project_id: int, + project_id: int = Path(alias="projectId"), ): return await BoardService(session).get_boards(project_id) + + +@board_router.patch( + "/{boardId}", + response_model=UpdateBoardResponse, + operation_id="update_board", +) +async def update_board( + session: SessionDependency, + request: UpdateBoardRequest, + board_id: int = Path(alias="boardId"), +): + return await BoardService(session).update_board(board_id, request) diff --git a/routes/deal.py b/routes/deal.py index 6acc0c4..5afeecc 100644 --- a/routes/deal.py +++ b/routes/deal.py @@ -1,4 +1,4 @@ -from fastapi import APIRouter +from fastapi import APIRouter, Path from backend.dependecies import SessionDependency from schemas.deal import GetDealsResponse @@ -11,12 +11,12 @@ deal_router = APIRouter( @deal_router.get( - "/{board_id}", + "/{boardId}", response_model=GetDealsResponse, operation_id="get_deals", ) async def get_deals( session: SessionDependency, - board_id: int, + board_id: int = Path(alias="boardId"), ): return await DealService(session).get_deals(board_id) diff --git a/schemas/base.py b/schemas/base.py index a5cd20e..cb40192 100644 --- a/schemas/base.py +++ b/schemas/base.py @@ -31,6 +31,10 @@ class BaseSchema(BaseModel): return [cls.model_validate(model) for model in sql_models] +class BaseResponse(BaseSchema): + message: str + + class PaginationSchema(BaseSchema): page: int | None = None items_per_page: int | None = None diff --git a/schemas/board.py b/schemas/board.py index e62615b..68bf7a5 100644 --- a/schemas/board.py +++ b/schemas/board.py @@ -1,4 +1,4 @@ -from schemas.base import BaseSchema +from schemas.base import BaseSchema, BaseResponse from schemas.status import StatusSchema @@ -15,11 +15,20 @@ class BoardSchema(BaseBoardSchema): statuses: list[StatusSchema] +class UpdateBoardSchema(BaseSchema): + name: str | None = None + lexorank: str | None = None + + # endregion # region Requests +class UpdateBoardRequest(BaseSchema): + board: UpdateBoardSchema + + # endregion # region Responses @@ -29,4 +38,7 @@ class GetBoardsResponse(BaseSchema): boards: list[BoardSchema] +class UpdateBoardResponse(BaseResponse): + pass + # endregion Responses diff --git a/services/board.py b/services/board.py index 397e286..aa2584a 100644 --- a/services/board.py +++ b/services/board.py @@ -1,7 +1,13 @@ +from fastapi import HTTPException from sqlalchemy.ext.asyncio import AsyncSession from repositories.board import BoardRepository -from schemas.board import GetBoardsResponse, BoardSchema +from schemas.board import ( + GetBoardsResponse, + BoardSchema, + UpdateBoardRequest, + UpdateBoardResponse, +) class BoardService: @@ -13,3 +19,11 @@ class BoardService: return GetBoardsResponse( boards=[BoardSchema.model_validate(board) for board in boards] ) + + async def update_board(self, board_id: int, request: UpdateBoardRequest): + board = await self.repository.get_by_id(board_id) + if not board: + raise HTTPException(status_code=404, detail="Доска не найдена") + + await self.repository.update(board, request.board) + return UpdateBoardResponse(message="Доска успешно обновлена")