From 9015d0f5243d04c8b59d5512f523d179e5d2ce5a Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Mon, 16 Mar 2026 11:30:49 -0700 Subject: [PATCH] Feat: Add live trades history API endpoint --- app/api/live-trades/route.js | 43 ++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 app/api/live-trades/route.js diff --git a/app/api/live-trades/route.js b/app/api/live-trades/route.js new file mode 100644 index 0000000..7be1a6e --- /dev/null +++ b/app/api/live-trades/route.js @@ -0,0 +1,43 @@ +import { NextResponse } from 'next/server'; +import Surreal from 'surrealdb'; + +export const dynamic = 'force-dynamic'; + +function normalizeRows(result) { + if (!Array.isArray(result) || !result.length) return []; + const first = result[0]; + if (Array.isArray(first)) return first; + if (first && typeof first === 'object' && Array.isArray(first.result)) return first.result; + return []; +} + +export async function GET(req) { + const url = process.env.SURREAL_URL; + if (!url) return NextResponse.json({ trades: [], error: 'No DB configured' }); + + const { searchParams } = new URL(req.url); + const strategyFilter = searchParams.get('strategy'); + + let client = null; + try { + client = new Surreal(); + await client.connect(url); + await client.signin({ username: process.env.SURREAL_USER, password: process.env.SURREAL_PASS }); + await client.use({ namespace: 'kalbot', database: 'kalbot' }); + + let query = 'SELECT * FROM live_orders WHERE settled = true'; + const vars = {}; + if (strategyFilter) { + query += ' AND strategy = $strategy'; + vars.strategy = strategyFilter; + } + query += ' ORDER BY settleTime DESC LIMIT 50'; + + const result = await client.query(query, vars); + return NextResponse.json({ trades: normalizeRows(result) }); + } catch (e) { + return NextResponse.json({ trades: [], error: e.message }); + } finally { + try { await client?.close?.(); } catch {} + } +}