feat: cards, attributes and modules
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import select, update, func, delete, and_
|
||||
from sqlalchemy import select, update, func, delete
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
from models import Project, Board
|
||||
from schemas.project import *
|
||||
@@ -9,28 +10,37 @@ from services.base import BaseService
|
||||
|
||||
class ProjectService(BaseService):
|
||||
async def get_projects(self) -> GetProjectsResponse:
|
||||
boards_sub = (
|
||||
select(Board)
|
||||
.where(Board.is_deleted == False)
|
||||
board_count_sub = (
|
||||
select(
|
||||
Board.project_id,
|
||||
func.count(Board.id).label('boards_count'),
|
||||
)
|
||||
.group_by(Board.project_id)
|
||||
.subquery()
|
||||
)
|
||||
stmt = (
|
||||
select(
|
||||
Project.id,
|
||||
Project.name,
|
||||
func.count(boards_sub.c.id)
|
||||
Project,
|
||||
func.coalesce(board_count_sub.c.boards_count, 0),
|
||||
)
|
||||
.outerjoin(board_count_sub, Project.id == board_count_sub.c.project_id)
|
||||
.options(
|
||||
selectinload(Project.attributes),
|
||||
selectinload(Project.modules),
|
||||
)
|
||||
.join(boards_sub, Project.id == boards_sub.c.project_id, isouter=True)
|
||||
.where(Project.is_deleted == False)
|
||||
.group_by(Project.id, Project.name)
|
||||
.order_by(Project.name)
|
||||
)
|
||||
project_data = (await self.session.execute(stmt)).all()
|
||||
|
||||
projects = []
|
||||
for project_id, name, boards_count in project_data:
|
||||
project = ProjectSchemaWithCount(id=project_id, name=name, boards_count=boards_count)
|
||||
projects.append(project)
|
||||
for project, boards_count in project_data:
|
||||
project_schema = FullProjectSchema(
|
||||
id=project.id,
|
||||
name=project.name,
|
||||
boards_count=boards_count,
|
||||
attributes=project.attributes,
|
||||
modules=project.modules,
|
||||
)
|
||||
projects.append(project_schema)
|
||||
|
||||
return GetProjectsResponse(projects=projects)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user