diff --git a/repositories/board.py b/repositories/board.py index 065e3e8..a97378c 100644 --- a/repositories/board.py +++ b/repositories/board.py @@ -1,10 +1,11 @@ +from datetime import datetime from typing import Optional from sqlalchemy import select from models import Board from repositories.base import BaseRepository -from schemas.board import UpdateBoardSchema +from schemas.board import UpdateBoardSchema, CreateBoardSchema class BoardRepository(BaseRepository): @@ -20,6 +21,15 @@ class BoardRepository(BaseRepository): result = await self.session.execute(stmt) return result.scalar_one_or_none() + async def create(self, data: CreateBoardSchema) -> Board: + board_data = data.model_dump() + board_data["created_at"] = datetime.now() + board = Board(**board_data) + self.session.add(board) + await self.session.commit() + await self.session.refresh(board) + return board + 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 diff --git a/routers/board.py b/routers/board.py index 10e603a..7711ea8 100644 --- a/routers/board.py +++ b/routers/board.py @@ -1,7 +1,13 @@ from fastapi import APIRouter, Path from backend.dependecies import SessionDependency -from schemas.board import GetBoardsResponse, UpdateBoardRequest, UpdateBoardResponse +from schemas.board import ( + GetBoardsResponse, + UpdateBoardRequest, + UpdateBoardResponse, + CreateBoardResponse, + CreateBoardRequest, +) from services import BoardService board_router = APIRouter( @@ -21,6 +27,18 @@ async def get_boards( return await BoardService(session).get_boards(project_id) +@board_router.post( + "/", + response_model=CreateBoardResponse, + operation_id="create_board", +) +async def create_board( + session: SessionDependency, + request: CreateBoardRequest, +): + return await BoardService(session).create_board(request) + + @board_router.patch( "/{boardId}", response_model=UpdateBoardResponse, diff --git a/schemas/board.py b/schemas/board.py index 8f13e29..af50366 100644 --- a/schemas/board.py +++ b/schemas/board.py @@ -6,12 +6,15 @@ from schemas.base import BaseSchema, BaseResponse # region Entity -class BaseBoardSchema(BaseSchema): - name: str - - -class BoardSchema(BaseBoardSchema): +class BoardSchema(BaseSchema): id: int + name: str + lexorank: str + + +class CreateBoardSchema(BaseSchema): + name: str + project_id: int lexorank: str @@ -25,6 +28,10 @@ class UpdateBoardSchema(BaseSchema): # region Requests +class CreateBoardRequest(BaseSchema): + board: CreateBoardSchema + + class UpdateBoardRequest(BaseSchema): board: UpdateBoardSchema @@ -38,7 +45,12 @@ class GetBoardsResponse(BaseSchema): boards: list[BoardSchema] +class CreateBoardResponse(BaseResponse): + board: BoardSchema + + class UpdateBoardResponse(BaseResponse): pass + # endregion Responses diff --git a/services/board.py b/services/board.py index 8ad9d0b..eeb266a 100644 --- a/services/board.py +++ b/services/board.py @@ -7,6 +7,8 @@ from schemas.board import ( BoardSchema, UpdateBoardRequest, UpdateBoardResponse, + CreateBoardRequest, + CreateBoardResponse, ) @@ -20,7 +22,16 @@ class BoardService: boards=[BoardSchema.model_validate(board) for board in boards] ) - async def update_board(self, board_id: int, request: UpdateBoardRequest): + async def create_board(self, request: CreateBoardRequest) -> CreateBoardResponse: + board = await self.repository.create(request.board) + return CreateBoardResponse( + board=BoardSchema.model_validate(board), + message="Доска успешно создана", + ) + + async def update_board( + self, board_id: int, request: UpdateBoardRequest + ) -> UpdateBoardResponse: board = await self.repository.get_by_id(board_id) if not board: raise HTTPException(status_code=404, detail="Доска не найдена")