53 lines
1.8 KiB
Python
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)
|