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)