| """API versioning router for RMI Backend.""" |
|
|
| from fastapi import APIRouter, Request |
|
|
| router = APIRouter(prefix="", tags=["api-versioning"]) |
|
|
| DEPRECATED_PATHS: dict[str, str] = {} |
|
|
|
|
| @router.get("/api/version") |
| async def api_version(): |
| """Return current API version info.""" |
| return { |
| "versions": {"v1": {"status": "stable"}, "v2": {"status": "planned"}}, |
| "current": "v1", |
| "docs": "/docs", |
| } |
|
|
|
|
| @router.get("/api") |
| async def api_root(): |
| """API root with version links.""" |
| return { |
| "message": "RugMunch Intelligence API", |
| "versions": {"v1": "/api/v1/", "v2": "/api/v2/ (planned)"}, |
| "docs": {"swagger": "/docs", "redoc": "/redoc", "openapi": "/openapi.json"}, |
| "health": "/health", |
| "metrics": "/metrics", |
| } |
|
|
|
|
| def register_deprecation(path: str, new_path: str) -> None: |
| """Register a deprecated path for sunset headers.""" |
| DEPRECATED_PATHS[path] = new_path |
|
|
|
|
| def setup_deprecation_middleware(app): |
| """Add deprecation headers middleware to the FastAPI app.""" |
|
|
| @app.middleware("http") |
| async def _deprecation(request: Request, call_next): |
| path = request.url.path |
| if path in DEPRECATED_PATHS: |
| response = await call_next(request) |
| response.headers["Deprecation"] = "true" |
| response.headers["Sunset"] = "Sat, 01 Jan 2027 00:00:00 GMT" |
| response.headers["Link"] = f'<{DEPRECATED_PATHS[path]}>; rel="successor-version"' |
| return response |
| return await call_next(request) |
|
|