Skip to content

Commit 7105506

Browse files
feat: Added API for deletion of processed files
1 parent 1f30b32 commit 7105506

5 files changed

Lines changed: 94 additions & 3 deletions

File tree

src/ContentProcessorAPI/app/libs/cosmos_db/helper.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ def update_document_by_query(self, query: Dict[str, Any], update: Dict[str, Any]
102102
result = self.container.update_one(query, {"$set": update})
103103
return result
104104

105-
def delete_document(self, item_id: str):
106-
result = self.container.delete_one({"Id": item_id})
105+
def delete_document(self, item_id: str, field_name: str = None):
106+
field_name = field_name or "Id" # Use "Id" if field_name is empty or None
107+
result = self.container.delete_one({field_name: item_id})
107108
return result

src/ContentProcessorAPI/app/libs/storage_blob/helper.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,24 @@ def delete_blob_and_cleanup(self, blob_name, container_name=None):
9090
# Delete the (virtual) folder in the Container
9191
blob_client = container_client.get_blob_client(container_name)
9292
blob_client.delete_blob()
93+
94+
def delete_folder(self, folder_name, container_name=None):
95+
container_client = self._get_container_client(container_name)
96+
97+
# List all blobs inside the folder
98+
blobs_to_delete = container_client.list_blobs(name_starts_with=folder_name + "/")
99+
100+
# Delete each blob
101+
for blob in blobs_to_delete:
102+
blob_client = container_client.get_blob_client(blob.name)
103+
blob_client.delete_blob()
104+
105+
blobs_to_delete = container_client.list_blobs()
106+
if not blobs_to_delete:
107+
108+
# Get Parent Container
109+
container_client = self._get_container_client()
110+
111+
# Delete the (virtual) folder in the Container
112+
blob_client = container_client.get_blob_client(folder_name)
113+
blob_client.delete_blob()

src/ContentProcessorAPI/app/routers/contentprocessor.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import urllib.parse
77
import uuid
88

9-
from fastapi import APIRouter, Body, Depends, File, UploadFile
9+
from fastapi import APIRouter, Body, Depends, File, HTTPException, UploadFile
1010
from fastapi.responses import JSONResponse, StreamingResponse
1111
from pymongo.results import UpdateResult
1212

@@ -28,6 +28,7 @@
2828
ContentProcess,
2929
ContentProcessorRequest,
3030
ContentResultUpdate,
31+
ContentResultDelete,
3132
Paging,
3233
ProcessFile,
3334
Status,
@@ -490,3 +491,31 @@ async def get_original_file(
490491
return StreamingResponse(
491492
file_stream, media_type=content_type_string, headers=headers
492493
)
494+
495+
@router.delete(
496+
"/processed/{process_id}",
497+
response_model=ContentResultDelete,
498+
summary="Delete the processed content result",
499+
description="""
500+
Returns the deleted record for a given process ID.
501+
""",
502+
)
503+
async def delete_processed_file(
504+
process_id: str, app_config: AppConfiguration = Depends(get_app_config)
505+
) -> ContentResultDelete:
506+
try:
507+
deleted_file = CosmosContentProcess(process_id=process_id).delete_processed_file(
508+
connection_string=app_config.app_cosmos_connstr,
509+
database_name=app_config.app_cosmos_database,
510+
collection_name=app_config.app_cosmos_container_process,
511+
storage_connection_string=app_config.app_storage_blob_url,
512+
container_name=app_config.app_cps_processes,
513+
)
514+
515+
except Exception as e:
516+
raise HTTPException(status_code=500, detail=str(e))
517+
return ContentResultDelete(
518+
status="Success" if deleted_file else "Failed",
519+
process_id=deleted_file.process_id if deleted_file else "",
520+
message="" if deleted_file else "This record no longer exists. Please refresh the page."
521+
)

src/ContentProcessorAPI/app/routers/models/contentprocessor/content_process.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,41 @@ def get_status_from_cosmos(
189189
return ContentProcess(**existing_process[0])
190190
else:
191191
return None
192+
193+
def delete_processed_file(
194+
self,
195+
connection_string: str,
196+
database_name: str,
197+
collection_name: str,
198+
storage_connection_string: str,
199+
container_name: str,
200+
):
201+
"""
202+
Delete the processed file from Cosmos DB & Storage account.
203+
"""
204+
mongo_helper = CosmosMongDBHelper(
205+
connection_string=connection_string,
206+
db_name=database_name,
207+
container_name=collection_name,
208+
indexes=[("process_id", 1)],
209+
)
210+
211+
blob_helper = StorageBlobHelper(
212+
account_url=storage_connection_string, container_name=container_name
213+
)
214+
215+
# Check if the process_id already exists in the database
216+
existing_process = mongo_helper.find_document(
217+
query={"process_id": self.process_id}
218+
)
219+
220+
blob_helper.delete_folder(folder_name=self.process_id)
221+
222+
if existing_process:
223+
mongo_helper.delete_document(item_id=self.process_id, field_name="process_id")
224+
return ContentProcess(**existing_process[0])
225+
else:
226+
return None
192227

193228
def update_process_result(
194229
self,

src/ContentProcessorAPI/app/routers/models/contentprocessor/model.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ class ContentResultUpdate(BaseModel):
6464
process_id: str
6565
modified_result: dict
6666

67+
class ContentResultDelete(BaseModel):
68+
process_id: str
69+
status: str
70+
message: str
71+
6772

6873
class ContentCommentUpdate(BaseModel):
6974
process_id: str

0 commit comments

Comments
 (0)