47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
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, iso_utc
|
|
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=iso_utc(trade.opened_at) or "",
|
|
closed_at=iso_utc(trade.closed_at) or "",
|
|
)
|
|
|
|
|
|
@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]
|