fix: surface empty OHLCV fetch as a warning, not success
Deploy / lint (push) Successful in 8s
Deploy / test (push) Successful in 1m25s
Deploy / deploy (push) Successful in 46s

Fetching a symbol the provider doesn't cover (e.g. RHM/Rheinmetall — Alpaca
serves US listings only) returned 0 bars but reported "complete · Successfully
ingested 0 records", which the UI showed as green success.

fetch_and_ingest now returns a distinct `no_data` status when the provider
returns nothing AND the ticker has no history (vs. "already up to date" when bars
exist). The fetch endpoint maps it to a `warning` source status, and the fetch
toast renders it as ⚠ with the provider message instead of success.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-28 19:27:41 +02:00
parent 6c2e45377c
commit 20a1c143f3
5 changed files with 97 additions and 4 deletions
+26 -1
View File
@@ -30,7 +30,7 @@ class IngestionResult:
symbol: str
records_ingested: int
last_date: date | None
status: str # "complete" | "partial" | "error"
status: str # "complete" | "partial" | "error" | "no_data"
message: str | None = None
@@ -143,6 +143,31 @@ async def fetch_and_ingest(
message=str(exc),
)
# Provider returned nothing. With no history at all this almost always means
# the provider doesn't cover this symbol (Alpaca = US listings only) — surface
# that instead of a misleading "success". With existing bars it just means
# there were no new bars in the requested window.
if not records:
existing = await _get_ohlcv_bar_count(db, ticker.id)
if existing == 0:
return IngestionResult(
symbol=ticker.symbol,
records_ingested=0,
last_date=None,
status="no_data",
message=(
"No data returned by the provider — it may not cover this symbol "
"(Alpaca serves US-listed securities only)."
),
)
return IngestionResult(
symbol=ticker.symbol,
records_ingested=0,
last_date=None,
status="complete",
message="Already up to date — no new bars.",
)
# Sort records by date to ensure ordered ingestion
records.sort(key=lambda r: r.date)