From af87356885588b4f9f2c96ca722e3fa8cddc8ab4 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 4 Apr 2026 10:34:23 +0000 Subject: [PATCH] Fix two critical backend bugs found during integration testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - versions.py: eagerly load public_assets in create_branch and append_patches_to_version refresh queries; missing selectinload caused MissingGreenlet 500 on every branch creation - documents.py: null root_version_id before cascade delete to break the circular FK (cv_documents → cv_versions → cv_documents), which was causing IntegrityError on every document deletion https://claude.ai/code/session_017HGM9VPptZG52asT5pbL6Y --- apps/backend/fastapi/app/services/documents.py | 3 +++ apps/backend/fastapi/app/services/versions.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/backend/fastapi/app/services/documents.py b/apps/backend/fastapi/app/services/documents.py index 76ca4ff..b176650 100644 --- a/apps/backend/fastapi/app/services/documents.py +++ b/apps/backend/fastapi/app/services/documents.py @@ -99,6 +99,9 @@ async def delete_document( await session.execute( delete(PublicAsset).where(PublicAsset.version_id.in_(version_ids)) ) + # Null root_version_id to break the circular FK before cascade + doc.root_version_id = None + await session.flush() await session.delete(doc) await session.commit() for key in artifact_keys: diff --git a/apps/backend/fastapi/app/services/versions.py b/apps/backend/fastapi/app/services/versions.py index 1a4402c..3560eaf 100644 --- a/apps/backend/fastapi/app/services/versions.py +++ b/apps/backend/fastapi/app/services/versions.py @@ -78,7 +78,7 @@ async def create_branch( stmt_refresh = ( select(CvVersion) .where(CvVersion.id == new_version.id) - .options(selectinload(CvVersion.patches)) + .options(selectinload(CvVersion.patches), selectinload(CvVersion.public_assets)) ) result = await session.execute(stmt_refresh) return result.scalars().one() @@ -138,7 +138,7 @@ async def append_patches_to_version( stmt_refresh = ( select(CvVersion) .where(CvVersion.id == version_id) - .options(selectinload(CvVersion.patches)) + .options(selectinload(CvVersion.patches), selectinload(CvVersion.public_assets)) ) result = await session.execute(stmt_refresh) return result.scalars().one()