From 01fd759f2aa9f8fe13dd69704f19eeaf89ab6a11 Mon Sep 17 00:00:00 2001 From: Pepe Fagoaga Date: Thu, 20 Mar 2025 19:41:54 +0100 Subject: [PATCH] refactor(deletion): isolate steps to remove blocks --- api/src/backend/tasks/jobs/deletion.py | 47 ++++++++++++++------------ 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/api/src/backend/tasks/jobs/deletion.py b/api/src/backend/tasks/jobs/deletion.py index 5ca08e70bb..b07bbbea87 100644 --- a/api/src/backend/tasks/jobs/deletion.py +++ b/api/src/backend/tasks/jobs/deletion.py @@ -1,5 +1,5 @@ from celery.utils.log import get_task_logger -from django.db import transaction +from django.db import DatabaseError, transaction from api.db_router import MainRouter from api.db_utils import batch_delete, rls_transaction @@ -21,33 +21,36 @@ def delete_provider(pk: str): Raises: Provider.DoesNotExist: If no instance with the provided primary key exists. + DatabaseError: If any deletion step fails. """ instance = Provider.all_objects.get(pk=pk) + deletion_summary = {} - with transaction.atomic(): - # Delete Scan Summaries - scan_summaries_qs = ScanSummary.all_objects.filter(scan__provider=instance) - _, scans_summ_summary = batch_delete(scan_summaries_qs) - deletion_summary.update(scans_summ_summary) + deletion_steps = [ + ("Scan Summaries", ScanSummary.all_objects.filter(scan__provider=instance)), + ("Findings", Finding.all_objects.filter(scan__provider=instance)), + ("Resources", Resource.all_objects.filter(provider=instance)), + ("Scans", Scan.all_objects.filter(provider=instance)), + ] - # Delete Findings - findings_qs = Finding.all_objects.filter(scan__provider=instance) - _, findings_summary = batch_delete(findings_qs) - deletion_summary.update(findings_summary) + for step_name, queryset in deletion_steps: + try: + with transaction.atomic(): + _, step_summary = batch_delete(queryset) + deletion_summary.update(step_summary) + except DatabaseError as error: + logger.error(f"Error deleting {step_name}: {error}") + raise - # Delete Resources - resources_qs = Resource.all_objects.filter(provider=instance) - _, resources_summary = batch_delete(resources_qs) - deletion_summary.update(resources_summary) - - # Delete Scans - scans_qs = Scan.all_objects.filter(provider=instance) - _, scans_summary = batch_delete(scans_qs) - deletion_summary.update(scans_summary) - - provider_deleted_count, provider_summary = instance.delete() - deletion_summary.update(provider_summary) + # Delete the provider itself + try: + with transaction.atomic(): + _, provider_summary = instance.delete() + deletion_summary.update(provider_summary) + except DatabaseError as error: + logger.error(f"Error deleting Provider: {error}") + raise return deletion_summary