from datetime import datetime from sqlalchemy import select, update, func, delete, and_ from models import Project, Board from schemas.project import * from services.base import BaseService class ProjectService(BaseService): async def get_projects(self) -> GetProjectsResponse: boards_sub = ( select(Board) .where(Board.is_deleted == False) .subquery() ) stmt = ( select( Project.id, Project.name, func.count(boards_sub.c.id) ) .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) return GetProjectsResponse(projects=projects) async def create_project(self, request: CreateProjectRequest) -> CreateProjectResponse: project = Project( name=request.project.name, created_at=datetime.now(), ) self.session.add(project) await self.session.commit() return UpdateProjectResponse(ok=True, message="Проект успешно создан") async def update_project(self, request: UpdateProjectRequest) -> UpdateProjectResponse: stmt = ( update(Project) .where(Project.id == request.project.id) .values(name=request.project.name) ) await self.session.execute(stmt) await self.session.commit() return UpdateProjectResponse(ok=True, message="Проект успешно изменен") async def delete_project(self, project_id: int) -> DeleteProjectResponse: stmt_boards = select(Board).where(Board.project_id == project_id) boards = (await self.session.scalars(stmt_boards)).all() if len(boards) == 0: stmt = ( delete(Project) .where(Project.id == project_id) ) else: stmt = ( update(Project) .where(Project.id == project_id) .values(is_deleted=True) ) await self.session.execute(stmt) await self.session.commit() return DeleteProjectResponse(ok=True, message="Проект успешно удален")