@cryptotaxi247 / CoPilot / commits / ea4b6d70

555 delete case bug (#556)

* fix: improve case deletion logic to remove related records and enhance error handling * fix: remove redundant case retrieval in delete_case function * fix: update CURRENT_VERSION to 0.1.9

taylor_socfortress committed Dec 10, 2025 at 16:26 UTC ea4b6d702284b09c937c9fd2ffc9911a7401db7a
2 files changed +31 -25
backend/app/incidents/services/db_operations.py
+30 -24
@@ -2344,36 +2344,42 @@ async def delete_alert(alert_id: int, db: AsyncSession):
2344
2345 async def delete_case(case_id: int, db: AsyncSession):
2346 """
2347 - Delete a case from the database.
2347 + Delete a case and all its related records (comments, alert links, data store files, etc.)
2348
2349 Args:
2350 - case_id (int): The ID of the case to be deleted.
2351 - db (AsyncSession): The database session.
2352 -
2353 - Raises:
2354 - HTTPException: If the case is not found or there is an error deleting the case.
2350 + case_id: The ID of the case to delete
2351 + db: Database session
2352 """
2356 - result = await db.execute(
2357 - select(Case).options(selectinload(Case.alerts), selectinload(Case.data_store)).where(Case.id == case_id),
2358 - )
2359 - case = result.scalars().first()
2360 - if not case:
2361 - raise HTTPException(status_code=404, detail="Case not found")
2362 -
2363 - # Delete entries from CaseAlertLink table
2364 - await db.execute(delete(CaseAlertLink).where(CaseAlertLink.case_id == case_id))
2365 -
2366 - # Delete entries from CaseDataStore table
2367 - await db.execute(delete(CaseDataStore).where(CaseDataStore.case_id == case_id))
2368 -
2369 - # Delete the case
2370 - await db.execute(delete(Case).where(Case.id == case.id))
2371 -
2353 try:
2354 + # 1. Delete all case comments first
2355 + logger.info(f"Deleting case comments for case {case_id}")
2356 + await db.execute(delete(CaseComment).where(CaseComment.case_id == case_id))
2357 +
2358 + # 2. Delete all case alert links
2359 + logger.info(f"Deleting case alert links for case {case_id}")
2360 + await db.execute(delete(CaseAlertLink).where(CaseAlertLink.case_id == case_id))
2361 +
2362 + # 3. Delete all data store files associated with the case
2363 + logger.info(f"Deleting data store files for case {case_id}")
2364 + files = await list_files_by_case_id(case_id, db)
2365 + for file in files:
2366 + try:
2367 + await delete_file_from_case(case_id, file.file_name, db)
2368 + except Exception as e:
2369 + logger.warning(f"Failed to delete file {file.file_name} from case {case_id}: {e}")
2370 +
2371 + # 4. Finally delete the case itself
2372 + logger.info(f"Deleting case {case_id}")
2373 + await db.execute(delete(Case).where(Case.id == case_id))
2374 +
2375 + # Commit all changes
2376 await db.commit()
2374 - except IntegrityError:
2377 + logger.info(f"Successfully deleted case {case_id} and all related records")
2378 +
2379 + except Exception as e:
2380 + logger.error(f"Error deleting case {case_id}: {e}")
2381 await db.rollback()
2376 - raise HTTPException(status_code=400, detail="Error deleting case")
2382 + raise HTTPException(status_code=500, detail=f"Failed to delete case: {str(e)}")
2383
2384
2385 async def list_all_files(db: AsyncSession) -> List[CaseDataStore]:
backend/app/version/services/version.py
+1 -1
@@ -7,7 +7,7 @@ from loguru import logger
7 from packaging.version import Version
8
9 # Current version - update this with each release
10 -CURRENT_VERSION = "0.1.8"
10 +CURRENT_VERSION = "0.1.9"
11 VERSION_CHECK_URL = "https://api.github.com/repos/socfortress/CoPilot/releases/latest"
12
13