Paginate review list (10/page); show open/close/hold duration in BJT.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-17 22:21:12 +08:00
parent 3164a21348
commit dbfddeedcb
4 changed files with 133 additions and 27 deletions
+30 -9
View File
@@ -247,12 +247,10 @@ def auth_token(conn: sqlite3.Connection, token: str) -> Optional[dict]:
return row_to_dict(row)
def list_trades(
conn: sqlite3.Connection,
limit: int = 200,
def _trades_where(
account_id: Optional[int] = None,
machine_id: Optional[int] = None,
) -> list[dict]:
) -> tuple[str, list[Any]]:
where: list[str] = []
params: list[Any] = []
if account_id is not None:
@@ -261,16 +259,39 @@ def list_trades(
if machine_id is not None:
where.append("t.machine_id=?")
params.append(machine_id)
sql = """
clause = (" WHERE " + " AND ".join(where)) if where else ""
return clause, params
def count_trades(
conn: sqlite3.Connection,
account_id: Optional[int] = None,
machine_id: Optional[int] = None,
) -> int:
clause, params = _trades_where(account_id, machine_id)
sql = f"SELECT COUNT(*) AS c FROM trades t{clause}"
row = conn.execute(sql, tuple(params)).fetchone()
return int(row["c"] if row else 0)
def list_trades(
conn: sqlite3.Connection,
limit: int = 200,
account_id: Optional[int] = None,
machine_id: Optional[int] = None,
offset: int = 0,
) -> list[dict]:
clause, params = _trades_where(account_id, machine_id)
sql = f"""
SELECT t.*, a.name AS account_name, m.name AS machine_name
FROM trades t
LEFT JOIN accounts a ON a.id = t.account_id
LEFT JOIN machines m ON m.id = t.machine_id
{clause}
ORDER BY COALESCE(t.close_time, t.open_time, t.created_at) DESC
LIMIT ? OFFSET ?
"""
if where:
sql += " WHERE " + " AND ".join(where)
sql += " ORDER BY COALESCE(t.close_time, t.open_time, t.created_at) DESC LIMIT ?"
params.append(limit)
params.extend([limit, max(0, int(offset))])
cur = conn.execute(sql, tuple(params))
rows = []
for r in cur.fetchall():