diff --git a/src/mpclookup/handlers/external.py b/src/mpclookup/handlers/external.py index 28eaab8..28e5efd 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, urlparse -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,22 +61,48 @@ 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. + Request a redirect to the MPCORB database record for a given designation. Notes ----- - Example request: + An example request could be: - /mpc-lookup/search?designation=2011+1001+T-2 + `/mpc-lookup/search?designation=2011+1001+T-2` + The "2011 " prefix, which is present in the DP0.3 data, will be + automatically stripped out so that the designation has a valid format. + + A designation without any spaces will cause a redirect to an endpoint + which returns a message indicating that the object appears to be 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}" + if " " in fd: + redirect_url = urlparse( + "https://www.minorplanetcenter.net/db_search/" + f"show_object?object_id={fd}" + ).geturl() + logger.info("Redirecting to MPC URL", redirect_url=redirect_url) + else: + redirect_url = urlparse( + str(request.url_for("get_synthetic_object")) + + "?" + + urlencode({"designation": designation}) + ).geturl() + logger.info( + "Redirecting synthetic object to", redirect_url=redirect_url + ) + return str(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." ) - logger.info("Redirecting to designation URL", redirect_url=redirect_url) - return redirect_url