a2ca82062e
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>
42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.orm import Session
|
|
|
|
from ..database import get_db
|
|
from .. import models
|
|
from ..dependencies import get_current_user
|
|
from ..services.btc import get_btc_price_eur
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/stats")
|
|
def get_stats(
|
|
db: Session = Depends(get_db),
|
|
current_user: models.User = Depends(get_current_user),
|
|
):
|
|
purchases = db.query(models.Purchase).filter(models.Purchase.user_id == current_user.id).all()
|
|
sells = db.query(models.Sell).filter(models.Sell.user_id == current_user.id).all()
|
|
|
|
total_invested = sum(p.amount_eur for p in purchases)
|
|
total_btc_bought = sum(p.amount_eur / p.price_eur for p in purchases) if purchases else 0.0
|
|
|
|
total_btc_sold = sum(s.btc_amount for s in sells)
|
|
proceeds_eur = sum(s.btc_amount * s.price_eur for s in sells)
|
|
|
|
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, price_is_cached = get_btc_price_eur()
|
|
portfolio_value = net_btc * current_price
|
|
profit_loss = portfolio_value - net_invested
|
|
|
|
return {
|
|
"total_invested": round(net_invested, 2),
|
|
"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),
|
|
}
|