Files
Fulfillment-Backend/services/project.py
2025-02-07 20:08:14 +04:00

74 lines
2.6 KiB
Python

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="Проект успешно удален")