feat: board creation endpoint

This commit is contained in:
2025-08-07 09:18:23 +04:00
parent 812e30a2f8
commit 734099165b
4 changed files with 59 additions and 8 deletions

View File

@ -1,10 +1,11 @@
from datetime import datetime
from typing import Optional from typing import Optional
from sqlalchemy import select from sqlalchemy import select
from models import Board from models import Board
from repositories.base import BaseRepository from repositories.base import BaseRepository
from schemas.board import UpdateBoardSchema from schemas.board import UpdateBoardSchema, CreateBoardSchema
class BoardRepository(BaseRepository): class BoardRepository(BaseRepository):
@ -20,6 +21,15 @@ class BoardRepository(BaseRepository):
result = await self.session.execute(stmt) result = await self.session.execute(stmt)
return result.scalar_one_or_none() 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: async def update(self, board: Board, data: UpdateBoardSchema) -> Board:
board.lexorank = data.lexorank if data.lexorank else board.lexorank board.lexorank = data.lexorank if data.lexorank else board.lexorank
board.name = data.name if data.name else board.name board.name = data.name if data.name else board.name

View File

@ -1,7 +1,13 @@
from fastapi import APIRouter, Path from fastapi import APIRouter, Path
from backend.dependecies import SessionDependency 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 from services import BoardService
board_router = APIRouter( board_router = APIRouter(
@ -21,6 +27,18 @@ async def get_boards(
return await BoardService(session).get_boards(project_id) 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( @board_router.patch(
"/{boardId}", "/{boardId}",
response_model=UpdateBoardResponse, response_model=UpdateBoardResponse,

View File

@ -6,12 +6,15 @@ from schemas.base import BaseSchema, BaseResponse
# region Entity # region Entity
class BaseBoardSchema(BaseSchema): class BoardSchema(BaseSchema):
name: str
class BoardSchema(BaseBoardSchema):
id: int id: int
name: str
lexorank: str
class CreateBoardSchema(BaseSchema):
name: str
project_id: int
lexorank: str lexorank: str
@ -25,6 +28,10 @@ class UpdateBoardSchema(BaseSchema):
# region Requests # region Requests
class CreateBoardRequest(BaseSchema):
board: CreateBoardSchema
class UpdateBoardRequest(BaseSchema): class UpdateBoardRequest(BaseSchema):
board: UpdateBoardSchema board: UpdateBoardSchema
@ -38,7 +45,12 @@ class GetBoardsResponse(BaseSchema):
boards: list[BoardSchema] boards: list[BoardSchema]
class CreateBoardResponse(BaseResponse):
board: BoardSchema
class UpdateBoardResponse(BaseResponse): class UpdateBoardResponse(BaseResponse):
pass pass
# endregion Responses # endregion Responses

View File

@ -7,6 +7,8 @@ from schemas.board import (
BoardSchema, BoardSchema,
UpdateBoardRequest, UpdateBoardRequest,
UpdateBoardResponse, UpdateBoardResponse,
CreateBoardRequest,
CreateBoardResponse,
) )
@ -20,7 +22,16 @@ class BoardService:
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): 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) board = await self.repository.get_by_id(board_id)
if not board: if not board:
raise HTTPException(status_code=404, detail="Доска не найдена") raise HTTPException(status_code=404, detail="Доска не найдена")