Compare commits

...

2 Commits

6 changed files with 67 additions and 9 deletions

View File

@ -3,6 +3,7 @@ from sqlalchemy.orm import selectinload
from models import Board from models import Board
from repositories.base import BaseRepository from repositories.base import BaseRepository
from schemas.board import UpdateBoardSchema
class BoardRepository(BaseRepository): class BoardRepository(BaseRepository):
@ -14,3 +15,17 @@ class BoardRepository(BaseRepository):
) )
result = await self.session.execute(stmt) result = await self.session.execute(stmt)
return list(result.scalars().all()) 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

View File

@ -1,7 +1,7 @@
from fastapi import APIRouter from fastapi import APIRouter, Path
from backend.dependecies import SessionDependency from backend.dependecies import SessionDependency
from schemas.board import GetBoardsResponse from schemas.board import GetBoardsResponse, UpdateBoardRequest, UpdateBoardResponse
from services.board import BoardService from services.board import BoardService
board_router = APIRouter( board_router = APIRouter(
@ -11,12 +11,25 @@ board_router = APIRouter(
@board_router.get( @board_router.get(
"/{project_id}", "/{projectId}",
response_model=GetBoardsResponse, response_model=GetBoardsResponse,
operation_id="get_boards", operation_id="get_boards",
) )
async def get_boards( async def get_boards(
session: SessionDependency, session: SessionDependency,
project_id: int, project_id: int = Path(alias="projectId"),
): ):
return await BoardService(session).get_boards(project_id) 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)

View File

@ -1,4 +1,4 @@
from fastapi import APIRouter from fastapi import APIRouter, Path
from backend.dependecies import SessionDependency from backend.dependecies import SessionDependency
from schemas.deal import GetDealsResponse from schemas.deal import GetDealsResponse
@ -11,12 +11,12 @@ deal_router = APIRouter(
@deal_router.get( @deal_router.get(
"/{board_id}", "/{boardId}",
response_model=GetDealsResponse, response_model=GetDealsResponse,
operation_id="get_deals", operation_id="get_deals",
) )
async def get_deals( async def get_deals(
session: SessionDependency, session: SessionDependency,
board_id: int, board_id: int = Path(alias="boardId"),
): ):
return await DealService(session).get_deals(board_id) return await DealService(session).get_deals(board_id)

View File

@ -31,6 +31,10 @@ class BaseSchema(BaseModel):
return [cls.model_validate(model) for model in sql_models] return [cls.model_validate(model) for model in sql_models]
class BaseResponse(BaseSchema):
message: str
class PaginationSchema(BaseSchema): class PaginationSchema(BaseSchema):
page: int | None = None page: int | None = None
items_per_page: int | None = None items_per_page: int | None = None

View File

@ -1,4 +1,4 @@
from schemas.base import BaseSchema from schemas.base import BaseSchema, BaseResponse
from schemas.status import StatusSchema from schemas.status import StatusSchema
@ -15,11 +15,20 @@ class BoardSchema(BaseBoardSchema):
statuses: list[StatusSchema] statuses: list[StatusSchema]
class UpdateBoardSchema(BaseSchema):
name: str | None = None
lexorank: str | None = None
# endregion # endregion
# region Requests # region Requests
class UpdateBoardRequest(BaseSchema):
board: UpdateBoardSchema
# endregion # endregion
# region Responses # region Responses
@ -29,4 +38,7 @@ class GetBoardsResponse(BaseSchema):
boards: list[BoardSchema] boards: list[BoardSchema]
class UpdateBoardResponse(BaseResponse):
pass
# endregion Responses # endregion Responses

View File

@ -1,7 +1,13 @@
from fastapi import HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from repositories.board import BoardRepository from repositories.board import BoardRepository
from schemas.board import GetBoardsResponse, BoardSchema from schemas.board import (
GetBoardsResponse,
BoardSchema,
UpdateBoardRequest,
UpdateBoardResponse,
)
class BoardService: class BoardService:
@ -13,3 +19,11 @@ class BoardService:
return GetBoardsResponse( return GetBoardsResponse(
boards=[BoardSchema.model_validate(board) for board in boards] 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="Доска успешно обновлена")