diff --git a/src/mpclookup/handlers/external.py b/src/mpclookup/handlers/external.py index 28eaab8..b33804b 100644 --- a/src/mpclookup/handlers/external.py +++ b/src/mpclookup/handlers/external.py @@ -1,9 +1,10 @@ """Handlers for the app's external root, ``/mpc-lookup/``.""" from typing import Annotated +from urllib.parse import urlencode -from fastapi import APIRouter, Depends, Query -from fastapi.responses import RedirectResponse +from fastapi import APIRouter, Depends, Query, Request +from fastapi.responses import PlainTextResponse, RedirectResponse from safir.dependencies.logger import logger_dependency from safir.metadata import get_metadata from structlog.stdlib import BoundLogger @@ -60,6 +61,7 @@ async def get_index( async def search( designation: Annotated[str, Query()], logger: Annotated[BoundLogger, Depends(logger_dependency)], + request: Request, ) -> str: """ Request a redirect to the MPCORB record for a given designation. @@ -68,14 +70,37 @@ async def search( ----- Example request: - /mpc-lookup/search?designation=2011+1001+T-2 + `/mpc-lookup/search?designation=2011+1001+T-2` + In this case, the "2011 " prefix, which is present in the DP0.3 data, will + be stripped out automatically so that the designation is valid. + + Any designations containing spaces will be redirected to an endpoint that + will return a text response indicating that the object is synthetic. """ logger.info("Request for designation URL", designation=designation) fd = designation.replace(_DESIGNATION_PREPEND, "") - redirect_url = ( - "https://www.minorplanetcenter.net/db_search/" - f"show_object?object_id={fd}" - ) - logger.info("Redirecting to designation URL", redirect_url=redirect_url) + if " " not in fd: + redirect_url = ( + "https://www.minorplanetcenter.net/db_search/" + f"show_object?object_id={fd}" + ) + logger.info("Redirecting to MPC URL", redirect_url=redirect_url) + else: + base_url = str(request.url_for("get_synthetic_object")) + query_string = urlencode({"designation": designation}) + redirect_url = base_url + "?" + query_string + logger.info( + "Redirecting synthetic object to", redirect_url=redirect_url + ) return redirect_url + + +@external_router.get("/synthetic_object", response_class=PlainTextResponse) +async def get_synthetic_object( + designation: Annotated[str, Query()], +) -> str: + return ( + f"{designation} " + "appears to be a synthetic object from the DP0.3 input simulation." + )