from __future__ import annotations import uuid from sqlalchemy.ext.asyncio import AsyncSession from cpv3.modules.projects.models import Project from cpv3.modules.projects.repository import ProjectRepository from cpv3.modules.projects.schemas import ProjectCreate, ProjectUpdate from cpv3.modules.users.models import User class ProjectService: """Service for project business logic and orchestration.""" def __init__(self, session: AsyncSession) -> None: self._repo = ProjectRepository(session) async def list_projects( self, *, requester: User, search: str | None = None, status: str | None = None, ) -> list[Project]: return await self._repo.list_all( requester=requester, search=search, status=status, ) async def get_project(self, project_id: uuid.UUID) -> Project | None: return await self._repo.get_by_id(project_id) async def create_project(self, *, requester: User, data: ProjectCreate) -> Project: folder = f"/{requester.username}/{data.name}" return await self._repo.create( requester=requester, data=data, folder=folder, status="DRAFT", ) async def update_project(self, project: Project, data: ProjectUpdate) -> Project: return await self._repo.update(project, data) async def deactivate_project(self, project: Project) -> None: await self._repo.deactivate(project) # Legacy function exports for backward compatibility async def list_projects(session: AsyncSession, *, requester: User) -> list[Project]: service = ProjectService(session) return await service.list_projects(requester=requester) async def get_project(session: AsyncSession, project_id: uuid.UUID) -> Project | None: service = ProjectService(session) return await service.get_project(project_id) async def create_project(session: AsyncSession, *, requester: User, data: ProjectCreate) -> Project: service = ProjectService(session) return await service.create_project(requester=requester, data=data) async def update_project(session: AsyncSession, project: Project, data: ProjectUpdate) -> Project: service = ProjectService(session) return await service.update_project(project, data) async def deactivate_project(session: AsyncSession, project: Project) -> None: service = ProjectService(session) await service.deactivate_project(project)