feat: get boards endpoint

This commit is contained in:
2025-08-03 13:42:11 +04:00
parent 8ef265cd45
commit ff147f93b1
9 changed files with 105 additions and 5 deletions

View File

@ -19,6 +19,7 @@ app.add_middleware(
routers_list = [
routes.project_router,
routes.board_router,
]
for router in routers_list:
app.include_router(router)

6
repositories/base.py Normal file
View File

@ -0,0 +1,6 @@
from sqlalchemy.ext.asyncio import AsyncSession
class BaseRepository:
def __init__(self, session: AsyncSession):
self.session = session

16
repositories/board.py Normal file
View File

@ -0,0 +1,16 @@
from sqlalchemy import select
from sqlalchemy.orm import selectinload
from models import Board
from repositories.base import BaseRepository
class BoardRepository(BaseRepository):
async def get_all(self, project_id: int) -> list[Board]:
stmt = (
select(Board)
.where(Board.is_deleted.is_(False), Board.project_id == project_id)
.options(selectinload(Board.statuses))
)
result = await self.session.execute(stmt)
return list(result.scalars().all())

View File

@ -1,13 +1,10 @@
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from models.project import Project
from repositories.base import BaseRepository
class ProjectRepository:
def __init__(self, session: AsyncSession):
self.session = session
class ProjectRepository(BaseRepository):
async def get_all(self) -> list[Project]:
stmt = select(Project).where(Project.is_deleted.is_(False))
result = await self.session.execute(stmt)

View File

@ -1 +1,2 @@
from .project import project_router as project_router
from .board import board_router as board_router

22
routes/board.py Normal file
View File

@ -0,0 +1,22 @@
from fastapi import APIRouter
from backend.dependecies import SessionDependency
from schemas.board import GetBoardsResponse
from services.board import BoardService
board_router = APIRouter(
prefix="/board",
tags=["board"],
)
@board_router.get(
"/{project_id}",
response_model=GetBoardsResponse,
operation_id="get_boards",
)
async def get_boards(
session: SessionDependency,
project_id: int,
):
return await BoardService(session).get_boards(project_id)

32
schemas/board.py Normal file
View File

@ -0,0 +1,32 @@
from schemas.base import BaseSchema
from schemas.status import StatusSchema
# region Entity
class BaseBoardSchema(BaseSchema):
name: str
class BoardSchema(BaseBoardSchema):
id: int
lexorank: str
statuses: list[StatusSchema]
# endregion
# region Requests
# endregion
# region Responses
class GetBoardsResponse(BaseSchema):
boards: list[BoardSchema]
# endregion Responses

10
schemas/status.py Normal file
View File

@ -0,0 +1,10 @@
from schemas.base import BaseSchema
class BaseStatusSchema(BaseSchema):
name: str
class StatusSchema(BaseStatusSchema):
id: int
lexorank: str

15
services/board.py Normal file
View File

@ -0,0 +1,15 @@
from sqlalchemy.ext.asyncio import AsyncSession
from repositories.board import BoardRepository
from schemas.board import GetBoardsResponse, BoardSchema
class BoardService:
def __init__(self, session: AsyncSession):
self.repository = BoardRepository(session)
async def get_boards(self, project_id: int) -> GetBoardsResponse:
projects = await self.repository.get_all(project_id)
return GetBoardsResponse(
boards=[BoardSchema.model_validate(project) for project in projects]
)