"""Routes for fixed income data.""" from fastapi import APIRouter, Query from models import ApiResponse from route_utils import safe import fixed_income_service router = APIRouter(prefix="/api/v1/fixed-income") @router.get("/treasury-rates", response_model=ApiResponse) @safe async def treasury_rates(): """Full treasury yield curve rates (4W-30Y).""" data = await fixed_income_service.get_treasury_rates() return ApiResponse(data=data) @router.get("/yield-curve", response_model=ApiResponse) @safe async def yield_curve(date: str = Query(default=None, max_length=10, pattern=r"^\d{4}-\d{2}-\d{2}$")): """Yield curve with maturity/rate pairs.""" data = await fixed_income_service.get_yield_curve(date=date) return ApiResponse(data=data) @router.get("/treasury-auctions", response_model=ApiResponse) @safe async def treasury_auctions( security_type: str = Query(default=None, max_length=30, pattern=r"^[a-zA-Z_ -]+$"), ): """Treasury auction data: bid-to-cover ratios, yields.""" data = await fixed_income_service.get_treasury_auctions(security_type=security_type) return ApiResponse(data=data) @router.get("/tips-yields", response_model=ApiResponse) @safe async def tips_yields(): """TIPS real yields by maturity.""" data = await fixed_income_service.get_tips_yields() return ApiResponse(data=data) @router.get("/effr", response_model=ApiResponse) @safe async def effr(): """Effective Federal Funds Rate with percentiles and volume.""" data = await fixed_income_service.get_effr() return ApiResponse(data=data) @router.get("/sofr", response_model=ApiResponse) @safe async def sofr(): """SOFR rate with 30/90/180-day moving averages.""" data = await fixed_income_service.get_sofr() return ApiResponse(data=data) @router.get("/hqm", response_model=ApiResponse) @safe async def hqm(): """High Quality Market corporate bond yields (AAA/AA/A).""" data = await fixed_income_service.get_hqm() return ApiResponse(data=data) @router.get("/commercial-paper", response_model=ApiResponse) @safe async def commercial_paper(): """Commercial paper rates by maturity and type.""" data = await fixed_income_service.get_commercial_paper() return ApiResponse(data=data) @router.get("/spot-rates", response_model=ApiResponse) @safe async def spot_rates(): """Corporate bond spot rates and par yields.""" data = await fixed_income_service.get_spot_rates() return ApiResponse(data=data) @router.get("/spreads", response_model=ApiResponse) @safe async def spreads( series: str = Query(default="tcm", pattern="^(tcm|tcm_effr|treasury_effr)$"), ): """Treasury/corporate spreads (tcm, tcm_effr, treasury_effr).""" data = await fixed_income_service.get_spreads(series=series) return ApiResponse(data=data)