- Added a new `DeleteConfirmationDialog` component for confirming deletions. - Updated `KnowledgeDropdown` to include a loading state and improved user feedback during file operations. - Enhanced the search page to support bulk deletion of documents with confirmation dialog. - Integrated event dispatching for knowledge updates after file operations. - Refactored various components for better readability and maintainability.
59 lines
2 KiB
Python
59 lines
2 KiB
Python
from starlette.requests import Request
|
|
from starlette.responses import JSONResponse
|
|
from utils.logging_config import get_logger
|
|
from config.settings import INDEX_NAME
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
async def delete_documents_by_filename(request: Request, document_service, session_manager):
|
|
"""Delete all documents with a specific filename"""
|
|
data = await request.json()
|
|
filename = data.get("filename")
|
|
|
|
if not filename:
|
|
return JSONResponse({"error": "filename is required"}, status_code=400)
|
|
|
|
user = request.state.user
|
|
jwt_token = request.state.jwt_token
|
|
|
|
try:
|
|
# Get user's OpenSearch client
|
|
opensearch_client = session_manager.get_user_opensearch_client(
|
|
user.user_id, jwt_token
|
|
)
|
|
|
|
# Delete by query to remove all chunks of this document
|
|
delete_query = {
|
|
"query": {
|
|
"bool": {
|
|
"must": [
|
|
{"term": {"filename": filename}}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
result = await opensearch_client.delete_by_query(
|
|
index=INDEX_NAME,
|
|
body=delete_query,
|
|
conflicts="proceed"
|
|
)
|
|
|
|
deleted_count = result.get("deleted", 0)
|
|
logger.info(f"Deleted {deleted_count} chunks for filename {filename}", user_id=user.user_id)
|
|
|
|
return JSONResponse({
|
|
"success": True,
|
|
"deleted_chunks": deleted_count,
|
|
"filename": filename,
|
|
"message": f"All documents with filename '{filename}' deleted successfully"
|
|
}, status_code=200)
|
|
|
|
except Exception as e:
|
|
logger.error("Error deleting documents by filename", filename=filename, error=str(e))
|
|
error_str = str(e)
|
|
if "AuthenticationException" in error_str:
|
|
return JSONResponse({"error": "Access denied: insufficient permissions"}, status_code=403)
|
|
else:
|
|
return JSONResponse({"error": str(e)}, status_code=500)
|