feat: projects and boards
This commit is contained in:
73
services/project.py
Normal file
73
services/project.py
Normal file
@@ -0,0 +1,73 @@
|
||||
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="Проект успешно удален")
|
||||
Reference in New Issue
Block a user