summaryrefslogtreecommitdiff
path: root/services/api/src/trading_api/routers/portfolio.py
blob: f4169cbd1f4e4ecd28b85e1bca1866b436d68a5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
"""Portfolio endpoints."""
from fastapi import APIRouter, Request
from shared.sa_models import PositionRow, PortfolioSnapshotRow
from sqlalchemy import select

router = APIRouter()


@router.get("/positions")
async def get_positions(request: Request):
    """Get all current positions."""
    db = request.app.state.db
    async with db.get_session() as session:
        result = await session.execute(select(PositionRow))
        rows = result.scalars().all()
        return [
            {
                "symbol": r.symbol,
                "quantity": float(r.quantity),
                "avg_entry_price": float(r.avg_entry_price),
                "current_price": float(r.current_price),
                "unrealized_pnl": float(r.quantity * (r.current_price - r.avg_entry_price)),
            }
            for r in rows
        ]


@router.get("/snapshots")
async def get_snapshots(request: Request, days: int = 30):
    """Get portfolio snapshots for the last N days."""
    db = request.app.state.db
    snapshots = await db.get_portfolio_snapshots(days=days)
    return [
        {
            "total_value": float(s["total_value"]),
            "realized_pnl": float(s["realized_pnl"]),
            "unrealized_pnl": float(s["unrealized_pnl"]),
            "snapshot_at": s["snapshot_at"].isoformat(),
        }
        for s in snapshots
    ]