fix: add missing prefix to charts router
All checks were successful
Deploy Development / deploy (push) Successful in 46s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 14s

Charts router had no prefix, causing 404 errors.

Fixed:
- Added prefix="/api/charts" to APIRouter()
- Changed all endpoint paths from "/charts/..." to "/..."
  (prefix already includes /api/charts)

Now endpoints resolve correctly:
/api/charts/energy-balance
/api/charts/recovery-score
etc.

All 23 chart endpoints now accessible.
This commit is contained in:
Lars 2026-03-29 07:08:05 +02:00
parent d4500ca00c
commit 176be3233e

View File

@ -62,13 +62,13 @@ from data_layer.correlations import (
) )
from data_layer.utils import serialize_dates, safe_float, calculate_confidence from data_layer.utils import serialize_dates, safe_float, calculate_confidence
router = APIRouter() router = APIRouter(prefix="/api/charts", tags=["charts"])
# ── Body Charts ───────────────────────────────────────────────────────────── # ── Body Charts ─────────────────────────────────────────────────────────────
@router.get("/charts/weight-trend") @router.get("/weight-trend")
def get_weight_trend_chart( def get_weight_trend_chart(
days: int = Query(default=90, ge=7, le=365, description="Analysis window in days"), days: int = Query(default=90, ge=7, le=365, description="Analysis window in days"),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -185,7 +185,7 @@ def get_weight_trend_chart(
} }
@router.get("/charts/body-composition") @router.get("/body-composition")
def get_body_composition_chart( def get_body_composition_chart(
days: int = Query(default=90, ge=7, le=365), days: int = Query(default=90, ge=7, le=365),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -249,7 +249,7 @@ def get_body_composition_chart(
} }
@router.get("/charts/circumferences") @router.get("/circumferences")
def get_circumferences_chart( def get_circumferences_chart(
max_age_days: int = Query(default=90, ge=7, le=365), max_age_days: int = Query(default=90, ge=7, le=365),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -321,7 +321,7 @@ def get_circumferences_chart(
# ── Nutrition Charts ──────────────────────────────────────────────────────── # ── Nutrition Charts ────────────────────────────────────────────────────────
@router.get("/charts/energy-balance") @router.get("/energy-balance")
def get_energy_balance_chart( def get_energy_balance_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -419,7 +419,7 @@ def get_energy_balance_chart(
} }
@router.get("/charts/macro-distribution") @router.get("/macro-distribution")
def get_macro_distribution_chart( def get_macro_distribution_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -509,7 +509,7 @@ def get_macro_distribution_chart(
} }
@router.get("/charts/protein-adequacy") @router.get("/protein-adequacy")
def get_protein_adequacy_chart( def get_protein_adequacy_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -623,7 +623,7 @@ def get_protein_adequacy_chart(
} }
@router.get("/charts/nutrition-consistency") @router.get("/nutrition-consistency")
def get_nutrition_consistency_chart( def get_nutrition_consistency_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -707,7 +707,7 @@ def get_nutrition_consistency_chart(
# ── Activity Charts ───────────────────────────────────────────────────────── # ── Activity Charts ─────────────────────────────────────────────────────────
@router.get("/charts/training-volume") @router.get("/training-volume")
def get_training_volume_chart( def get_training_volume_chart(
weeks: int = Query(default=12, ge=4, le=52), weeks: int = Query(default=12, ge=4, le=52),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -787,7 +787,7 @@ def get_training_volume_chart(
} }
@router.get("/charts/training-type-distribution") @router.get("/training-type-distribution")
def get_training_type_distribution_chart( def get_training_type_distribution_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -853,7 +853,7 @@ def get_training_type_distribution_chart(
} }
@router.get("/charts/quality-sessions") @router.get("/quality-sessions")
def get_quality_sessions_chart( def get_quality_sessions_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -930,7 +930,7 @@ def get_quality_sessions_chart(
} }
@router.get("/charts/load-monitoring") @router.get("/load-monitoring")
def get_load_monitoring_chart( def get_load_monitoring_chart(
days: int = Query(default=28, ge=14, le=90), days: int = Query(default=28, ge=14, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1018,7 +1018,7 @@ def get_load_monitoring_chart(
} }
@router.get("/charts/monotony-strain") @router.get("/monotony-strain")
def get_monotony_strain_chart( def get_monotony_strain_chart(
days: int = Query(default=7, ge=7, le=28), days: int = Query(default=7, ge=7, le=28),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1078,7 +1078,7 @@ def get_monotony_strain_chart(
} }
@router.get("/charts/ability-balance") @router.get("/ability-balance")
def get_ability_balance_chart( def get_ability_balance_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1152,7 +1152,7 @@ def get_ability_balance_chart(
} }
@router.get("/charts/volume-by-ability") @router.get("/volume-by-ability")
def get_volume_by_ability_chart( def get_volume_by_ability_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1242,7 +1242,7 @@ def get_volume_by_ability_chart(
# ── Recovery Charts ───────────────────────────────────────────────────────── # ── Recovery Charts ─────────────────────────────────────────────────────────
@router.get("/charts/recovery-score") @router.get("/recovery-score")
def get_recovery_score_chart( def get_recovery_score_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1349,7 +1349,7 @@ def get_recovery_score_chart(
} }
@router.get("/charts/hrv-rhr-baseline") @router.get("/hrv-rhr-baseline")
def get_hrv_rhr_baseline_chart( def get_hrv_rhr_baseline_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1451,7 +1451,7 @@ def get_hrv_rhr_baseline_chart(
} }
@router.get("/charts/sleep-duration-quality") @router.get("/sleep-duration-quality")
def get_sleep_duration_quality_chart( def get_sleep_duration_quality_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1559,7 +1559,7 @@ def get_sleep_duration_quality_chart(
} }
@router.get("/charts/sleep-debt") @router.get("/sleep-debt")
def get_sleep_debt_chart( def get_sleep_debt_chart(
days: int = Query(default=28, ge=7, le=90), days: int = Query(default=28, ge=7, le=90),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1660,7 +1660,7 @@ def get_sleep_debt_chart(
} }
@router.get("/charts/vital-signs-matrix") @router.get("/vital-signs-matrix")
def get_vital_signs_matrix_chart( def get_vital_signs_matrix_chart(
days: int = Query(default=7, ge=7, le=30), days: int = Query(default=7, ge=7, le=30),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1787,7 +1787,7 @@ def get_vital_signs_matrix_chart(
# ── Correlation Charts ────────────────────────────────────────────────────── # ── Correlation Charts ──────────────────────────────────────────────────────
@router.get("/charts/weight-energy-correlation") @router.get("/weight-energy-correlation")
def get_weight_energy_correlation_chart( def get_weight_energy_correlation_chart(
max_lag: int = Query(default=14, ge=7, le=28), max_lag: int = Query(default=14, ge=7, le=28),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1852,7 +1852,7 @@ def get_weight_energy_correlation_chart(
} }
@router.get("/charts/lbm-protein-correlation") @router.get("/lbm-protein-correlation")
def get_lbm_protein_correlation_chart( def get_lbm_protein_correlation_chart(
max_lag: int = Query(default=14, ge=7, le=28), max_lag: int = Query(default=14, ge=7, le=28),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1915,7 +1915,7 @@ def get_lbm_protein_correlation_chart(
} }
@router.get("/charts/load-vitals-correlation") @router.get("/load-vitals-correlation")
def get_load_vitals_correlation_chart( def get_load_vitals_correlation_chart(
max_lag: int = Query(default=14, ge=7, le=28), max_lag: int = Query(default=14, ge=7, le=28),
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
@ -1991,7 +1991,7 @@ def get_load_vitals_correlation_chart(
} }
@router.get("/charts/recovery-performance") @router.get("/recovery-performance")
def get_recovery_performance_chart( def get_recovery_performance_chart(
session: dict = Depends(require_auth) session: dict = Depends(require_auth)
) -> Dict: ) -> Dict:
@ -2087,7 +2087,7 @@ def get_recovery_performance_chart(
# ── Health Endpoint ────────────────────────────────────────────────────────── # ── Health Endpoint ──────────────────────────────────────────────────────────
@router.get("/charts/health") @router.get("/health")
def health_check() -> Dict: def health_check() -> Dict:
""" """
Health check endpoint for charts API. Health check endpoint for charts API.