diff --git a/src/moai/core/services/project.py b/src/moai/core/services/project.py index a8ddd8d..b438b3a 100644 --- a/src/moai/core/services/project.py +++ b/src/moai/core/services/project.py @@ -69,3 +69,48 @@ async def get_project_by_name(name: str) -> Project | None: async with get_session() as session: result = await session.execute(select(Project).where(Project.name.ilike(name))) return result.scalar_one_or_none() + + +async def update_project_models(project_id: str, models: list[str]) -> Project | None: + """Update a project's models list. + + Args: + project_id: The project's UUID. + models: List of AI model identifiers. + + Returns: + The updated Project object if found, None otherwise. + """ + async with get_session() as session: + result = await session.execute(select(Project).where(Project.id == project_id)) + project = result.scalar_one_or_none() + + if project is None: + return None + + project.models = models + await session.flush() + await session.refresh(project) + return project + + +async def delete_project(project_id: str) -> bool: + """Delete a project by ID. + + Cascade delete will handle discussions/rounds/messages via SQLAlchemy relationship config. + + Args: + project_id: The project's UUID. + + Returns: + True if deleted, False if not found. + """ + async with get_session() as session: + result = await session.execute(select(Project).where(Project.id == project_id)) + project = result.scalar_one_or_none() + + if project is None: + return False + + await session.delete(project) + return True