Cache last known BTC price and show stale warning in UI
When the CoinGecko API fails, fall back to the last successful price instead of 0.0, and surface a warning indicator on the price card. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -26,7 +26,7 @@ def get_stats(
|
||||
net_btc = total_btc_bought - total_btc_sold
|
||||
net_invested = total_invested - proceeds_eur
|
||||
average_price = net_invested / net_btc if net_btc > 0 else 0.0
|
||||
current_price = get_btc_price_eur()
|
||||
current_price, price_is_cached = get_btc_price_eur()
|
||||
portfolio_value = net_btc * current_price
|
||||
profit_loss = portfolio_value - net_invested
|
||||
|
||||
@@ -35,6 +35,7 @@ def get_stats(
|
||||
"total_btc": round(net_btc, 8),
|
||||
"average_price": round(average_price, 2),
|
||||
"current_price": round(current_price, 2),
|
||||
"price_is_cached": price_is_cached,
|
||||
"portfolio_value": round(portfolio_value, 2),
|
||||
"profit_loss": round(profit_loss, 2),
|
||||
}
|
||||
|
||||
@@ -54,7 +54,12 @@ def aggregate_to_daily(raw: list) -> dict:
|
||||
return by_date
|
||||
|
||||
|
||||
def get_btc_price_eur() -> float:
|
||||
_last_known_price: float = 0.0
|
||||
|
||||
|
||||
def get_btc_price_eur() -> tuple[float, bool]:
|
||||
"""Returns (price, is_cached). is_cached=True when using a stale fallback."""
|
||||
global _last_known_price
|
||||
try:
|
||||
resp = requests.get(
|
||||
"https://api.coingecko.com/api/v3/simple/price",
|
||||
@@ -62,7 +67,9 @@ def get_btc_price_eur() -> float:
|
||||
timeout=10,
|
||||
)
|
||||
resp.raise_for_status()
|
||||
return float(resp.json()["bitcoin"]["eur"])
|
||||
price = float(resp.json()["bitcoin"]["eur"])
|
||||
_last_known_price = price
|
||||
return price, False
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to fetch BTC price: {e}")
|
||||
return 0.0
|
||||
return _last_known_price, True
|
||||
|
||||
Reference in New Issue
Block a user