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