"""Order endpoints.""" import logging from fastapi import APIRouter, HTTPException, Query, Request from slowapi import Limiter from slowapi.util import get_remote_address from sqlalchemy import select from sqlalchemy.exc import OperationalError from shared.sa_models import OrderRow, SignalRow logger = logging.getLogger(__name__) router = APIRouter() limiter = Limiter(key_func=get_remote_address) @router.get("/") @limiter.limit("60/minute") async def get_orders(request: Request, limit: int = Query(50, ge=1, le=1000)): """Get recent orders.""" try: db = request.app.state.db async with db.get_session() as session: stmt = select(OrderRow).order_by(OrderRow.created_at.desc()).limit(limit) result = await session.execute(stmt) rows = result.scalars().all() return [ { "id": r.id, "signal_id": r.signal_id, "symbol": r.symbol, "side": r.side, "type": r.type, "price": float(r.price), "quantity": float(r.quantity), "status": r.status, "created_at": r.created_at.isoformat() if r.created_at else None, "filled_at": r.filled_at.isoformat() if r.filled_at else None, } for r in rows ] except OperationalError as exc: logger.error("Database error fetching orders: %s", exc) raise HTTPException(status_code=503, detail="Database unavailable") from exc except Exception as exc: logger.error("Failed to get orders: %s", exc, exc_info=True) raise HTTPException(status_code=500, detail="Failed to retrieve orders") from exc @router.get("/signals") @limiter.limit("60/minute") async def get_signals(request: Request, limit: int = Query(50, ge=1, le=1000)): """Get recent signals.""" try: db = request.app.state.db async with db.get_session() as session: stmt = select(SignalRow).order_by(SignalRow.created_at.desc()).limit(limit) result = await session.execute(stmt) rows = result.scalars().all() return [ { "id": r.id, "strategy": r.strategy, "symbol": r.symbol, "side": r.side, "price": float(r.price), "quantity": float(r.quantity), "reason": r.reason, "created_at": r.created_at.isoformat() if r.created_at else None, } for r in rows ] except OperationalError as exc: logger.error("Database error fetching signals: %s", exc) raise HTTPException(status_code=503, detail="Database unavailable") from exc except Exception as exc: logger.error("Failed to get signals: %s", exc, exc_info=True) raise HTTPException(status_code=500, detail="Failed to retrieve signals") from exc