import random from typing import Union from fastapi import FastAPI from pydantic import AfterValidator from typing_extensions import Annotated app = FastAPI() data = { "isbn-9781529046137": "The Hitchhiker's Guide to the Galaxy", "imdb-tt0371724": "The Hitchhiker's Guide to the Galaxy", "isbn-9781439512982": "Isaac Asimov: The Complete Stories, Vol. 2", } def check_valid_id(id: str): if not id.startswith(("isbn-", "imdb-")): raise ValueError('Invalid ID format, it must start with "isbn-" or "imdb-"') return id @app.get("/items/") async def read_items( id: Annotated[Union[str, None], AfterValidator(check_valid_id)] = None, ): if id: item = data.get(id) else: id, item = random.choice(list(data.items())) return {"id": id, "name": item}