Fix two critical backend bugs found during integration testing

- 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
This commit is contained in:
Claude
2026-04-04 10:34:23 +00:00
parent aa419cde0d
commit af87356885
2 changed files with 5 additions and 2 deletions

View File

@@ -99,6 +99,9 @@ async def delete_document(
await session.execute( await session.execute(
delete(PublicAsset).where(PublicAsset.version_id.in_(version_ids)) 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.delete(doc)
await session.commit() await session.commit()
for key in artifact_keys: for key in artifact_keys:

View File

@@ -78,7 +78,7 @@ async def create_branch(
stmt_refresh = ( stmt_refresh = (
select(CvVersion) select(CvVersion)
.where(CvVersion.id == new_version.id) .where(CvVersion.id == new_version.id)
.options(selectinload(CvVersion.patches)) .options(selectinload(CvVersion.patches), selectinload(CvVersion.public_assets))
) )
result = await session.execute(stmt_refresh) result = await session.execute(stmt_refresh)
return result.scalars().one() return result.scalars().one()
@@ -138,7 +138,7 @@ async def append_patches_to_version(
stmt_refresh = ( stmt_refresh = (
select(CvVersion) select(CvVersion)
.where(CvVersion.id == version_id) .where(CvVersion.id == version_id)
.options(selectinload(CvVersion.patches)) .options(selectinload(CvVersion.patches), selectinload(CvVersion.public_assets))
) )
result = await session.execute(stmt_refresh) result = await session.execute(stmt_refresh)
return result.scalars().one() return result.scalars().one()