import logging from typing import List from fastapi import APIRouter, Depends, Query from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models import BotTrade from app.schemas import BotTrade as BotTradeSchema router = APIRouter() logger = logging.getLogger(__name__) def _trade_to_schema(trade: BotTrade) -> BotTradeSchema: return BotTradeSchema( id=trade.id, asset=trade.asset, side=trade.side, entry_price=trade.entry_price, exit_price=trade.exit_price or 0.0, pnl_usd=trade.pnl_usd or 0.0, hold_seconds=trade.hold_seconds or 0, trigger_post_id=trade.trigger_post_id or 0, opened_at=trade.opened_at.isoformat(), closed_at=trade.closed_at.isoformat() if trade.closed_at else "", ) @router.get("/trades", response_model=List[BotTradeSchema]) async def get_trades( limit: int = Query(default=20, ge=1, le=100), page: int = Query(default=1, ge=1), db: AsyncSession = Depends(get_db), ): offset = (page - 1) * limit result = await db.execute( select(BotTrade) .where(BotTrade.closed_at.is_not(None)) .order_by(BotTrade.opened_at.desc()) .offset(offset) .limit(limit) ) trades = result.scalars().all() return [_trade_to_schema(t) for t in trades]