"""Routes for regulatory data (CFTC, SEC).""" from fastapi import APIRouter, Path, Query from models import ApiResponse from route_utils import safe, validate_symbol import regulators_service router = APIRouter(prefix="/api/v1/regulators") @router.get("/cot", response_model=ApiResponse) @safe async def cot_report(symbol: str = Query(..., min_length=1, max_length=20)): """Commitment of Traders: commercial/speculator positions for futures.""" symbol = validate_symbol(symbol) data = await regulators_service.get_cot(symbol) return ApiResponse(data=data) @router.get("/cot/search", response_model=ApiResponse) @safe async def cot_search(query: str = Query(..., min_length=1, max_length=100)): """Search COT report symbols.""" data = await regulators_service.cot_search(query) return ApiResponse(data=data) @router.get("/sec/litigation", response_model=ApiResponse) @safe async def sec_litigation(): """SEC litigation releases RSS feed.""" data = await regulators_service.get_sec_litigation() return ApiResponse(data=data) @router.get("/sec/institutions", response_model=ApiResponse) @safe async def sec_institutions(query: str = Query(..., min_length=1, max_length=100)): """Search institutional investors filing with SEC.""" data = await regulators_service.search_institutions(query) return ApiResponse(data=data) @router.get("/sec/cik-map/{symbol}", response_model=ApiResponse) @safe async def sec_cik_map(symbol: str = Path(..., min_length=1, max_length=20)): """Map ticker symbol to SEC CIK number.""" symbol = validate_symbol(symbol) data = await regulators_service.get_cik_map(symbol) return ApiResponse(data=data)