fix: график крипты открывать за всё время, лучший/худший рост — по выбранному периоду

График во вкладке «Криптовалюта» теперь по умолчанию показывает всю
историю, а не 30 дней — короткое окно у портфеля, растущего годами,
часто попадало на локальную просадку и выглядело демотивирующе.

Плитки «Лучший рост» и «Худшее падение» раньше всегда считались за
24 часа. Теперь они следуют за диапазоном, выбранным у графика
(7д/30д/90д/всё время): для 7д/30д используются закэшированные данные
CoinGecko, для «всё время» — метрика за 1 год (дальше бесплатный
тариф CoinGecko историю не отдаёт), а для 90д — отдельный запрос по
каждой монете, который выполняется только когда пользователь реально
выбрал этот период.
This commit is contained in:
ZProger
2026-09-04 02:18:31 +03:00
parent aefd6cc035
commit cd125e9e45
15 changed files with 404 additions and 33 deletions

View File

@@ -6,6 +6,7 @@ from app.schemas.crypto import (
CryptoHistoryResponse,
CryptoHoldingCreate,
CryptoHoldingRead,
CryptoPerformanceResponse,
CryptoPortfolioCreate,
CryptoPortfolioRead,
CryptoPortfolioUpdate,
@@ -22,6 +23,7 @@ from app.services.crypto_service import (
create_portfolio,
delete_portfolio,
delete_transaction,
get_90d_performance,
get_crypto_history,
list_portfolios,
list_transactions,
@@ -130,3 +132,13 @@ async def read_crypto_history(
session: AsyncSession = Depends(get_session),
) -> CryptoHistoryResponse:
return await get_crypto_history(session, range, portfolio_id)
@router.get("/performance/90d", response_model=CryptoPerformanceResponse)
async def read_90d_performance(
portfolio_id: int | None = None, session: AsyncSession = Depends(get_session)
) -> CryptoPerformanceResponse:
"""Backs the Best/Worst Performer stat only while the 90d range is
selected — see get_90d_performance's docstring for why this is a
separate on-demand call instead of a cached field like 7d/30d/1y."""
return await get_90d_performance(session, portfolio_id)