From e2e10d9b2e3f4c24639c5a395eae4d791c730540 Mon Sep 17 00:00:00 2001 From: Mikkel Georgsen Date: Fri, 16 Jan 2026 18:54:39 +0000 Subject: [PATCH] feat(03-03): add update_models and delete_project to service Add update_project_models(project_id, models) and delete_project(project_id) functions to complete the project service CRUD operations. Co-Authored-By: Claude Opus 4.5 --- src/moai/core/services/project.py | 45 +++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) 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