openrag/src/api/search.py
2025-09-18 15:23:10 -04:00

53 lines
1.8 KiB
Python

from starlette.requests import Request
from starlette.responses import JSONResponse
from utils.logging_config import get_logger
logger = get_logger(__name__)
async def search(request: Request, search_service, session_manager):
"""Search for documents"""
try:
payload = await request.json()
query = payload.get("query")
if not query:
return JSONResponse({"error": "Query is required"}, status_code=400)
filters = payload.get("filters", {}) # Optional filters, defaults to empty dict
limit = payload.get("limit", 10) # Optional limit, defaults to 10
score_threshold = payload.get(
"scoreThreshold", 0
) # Optional score threshold, defaults to 0
user = request.state.user
jwt_token = session_manager.get_effective_jwt_token(user.user_id, request.state.jwt_token)
logger.debug(
"Search API request",
user=str(user),
user_id=user.user_id if user else None,
has_jwt_token=jwt_token is not None,
query=query,
filters=filters,
limit=limit,
score_threshold=score_threshold,
)
result = await search_service.search(
query,
user_id=user.user_id,
jwt_token=jwt_token,
filters=filters,
limit=limit,
score_threshold=score_threshold,
)
return JSONResponse(result, status_code=200)
except Exception as e:
error_msg = str(e)
if (
"AuthenticationException" in error_msg
or "access denied" in error_msg.lower()
):
return JSONResponse({"error": error_msg}, status_code=403)
else:
return JSONResponse({"error": error_msg}, status_code=500)