diff --git a/main.py b/main.py index f05069f..c131116 100644 --- a/main.py +++ b/main.py @@ -19,6 +19,7 @@ app.add_middleware( routers_list = [ routes.project_router, + routes.board_router, ] for router in routers_list: app.include_router(router) diff --git a/repositories/base.py b/repositories/base.py new file mode 100644 index 0000000..e8ee54f --- /dev/null +++ b/repositories/base.py @@ -0,0 +1,6 @@ +from sqlalchemy.ext.asyncio import AsyncSession + + +class BaseRepository: + def __init__(self, session: AsyncSession): + self.session = session diff --git a/repositories/board.py b/repositories/board.py new file mode 100644 index 0000000..dd5af90 --- /dev/null +++ b/repositories/board.py @@ -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()) diff --git a/repositories/project.py b/repositories/project.py index 9503613..43436c8 100644 --- a/repositories/project.py +++ b/repositories/project.py @@ -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) diff --git a/routes/__init__.py b/routes/__init__.py index dc12938..e14887b 100644 --- a/routes/__init__.py +++ b/routes/__init__.py @@ -1 +1,2 @@ from .project import project_router as project_router +from .board import board_router as board_router diff --git a/routes/board.py b/routes/board.py new file mode 100644 index 0000000..a0197a1 --- /dev/null +++ b/routes/board.py @@ -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) diff --git a/schemas/board.py b/schemas/board.py new file mode 100644 index 0000000..e62615b --- /dev/null +++ b/schemas/board.py @@ -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 diff --git a/schemas/status.py b/schemas/status.py new file mode 100644 index 0000000..f76a663 --- /dev/null +++ b/schemas/status.py @@ -0,0 +1,10 @@ +from schemas.base import BaseSchema + + +class BaseStatusSchema(BaseSchema): + name: str + + +class StatusSchema(BaseStatusSchema): + id: int + lexorank: str diff --git a/services/board.py b/services/board.py new file mode 100644 index 0000000..ddaf5a5 --- /dev/null +++ b/services/board.py @@ -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] + )