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