fix: /posts source filter, /performance closed_at basis, funding venue field
- /posts gains an optional ?source= filter. The Macro page was pulling the latest-500 posts globally and filtering client-side; rare scanner signals (btc_bottom_reversal ~2-4/cycle, funding_reversal hourly) got pushed off the page by frequent Trump posts, so Macro falsely showed "no signals". - /performance now filters and orders by closed_at (realized-PnL-in-window) instead of opened_at, so it shares ONE basis with the frontend Analytics page (which filters every window by closed_at). Boundary trades no longer land in one basis but not the other. - funding snapshot returns the actual `venue` (provider.name) so the frontend label follows the real data source instead of hardcoding "Binance". 72 tests pass. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+11
-3
@@ -74,13 +74,21 @@ async def get_posts(
|
||||
request: Request,
|
||||
limit: int = Query(default=20, ge=1, le=500),
|
||||
page: int = Query(default=1, ge=1),
|
||||
source: Optional[str] = Query(
|
||||
default=None,
|
||||
description="Filter to a single source (e.g. 'btc_bottom_reversal', "
|
||||
"'funding_reversal', 'truth'). Without it, rare-source "
|
||||
"signals can be pushed off the latest-N page by Trump posts.",
|
||||
),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
response: Response = None,
|
||||
):
|
||||
offset = (page - 1) * limit
|
||||
result = await db.execute(
|
||||
select(Post).order_by(Post.published_at.desc()).offset(offset).limit(limit)
|
||||
)
|
||||
stmt = select(Post)
|
||||
if source:
|
||||
stmt = stmt.where(Post.source == source)
|
||||
stmt = stmt.order_by(Post.published_at.desc()).offset(offset).limit(limit)
|
||||
result = await db.execute(stmt)
|
||||
posts = result.scalars().all()
|
||||
# Posts are scraped every 5s but rarely change once written — allow CDN/browser
|
||||
# to cache for 30s. stale-while-revalidate=60 means stale content is served
|
||||
|
||||
Reference in New Issue
Block a user