from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, Query, Response from pydantic import BaseModel, ConfigDict, field_validator from ..auth import get_current_user from ..clients.jellystat import HistoryLimitError, JellystatError from ..services.insights import get_insights from ..services.insights_artwork import get_artwork from ..runtime import get_runtime_settings router = APIRouter(prefix="/insights", tags=["insights"]) @router.get("/artwork/{item_id}") async def artwork(item_id: str, token: Annotated[str, Query(max_length=100)], user: dict = Depends(get_current_user)): content, media_type = await get_artwork(user, get_runtime_settings(), item_id, token) return Response(content=content, media_type=media_type, headers={"Cache-Control": "private, max-age=600", "Vary": "Cookie, Authorization", "X-Content-Type-Options": "nosniff"}) class InsightsQuery(BaseModel): model_config = ConfigDict(extra="forbid") days: int = 30 @field_validator("days") @classmethod def supported_period(cls, value: int) -> int: if value not in {7, 30, 90, 365}: raise ValueError("Choose 7, 30, 90 or 365 days") return value @router.get("") async def dashboard(query: Annotated[InsightsQuery, Query()], response: Response, user: dict = Depends(get_current_user)) -> dict: response.headers["Cache-Control"] = "no-store" try: return await get_insights(user, query.days) except HistoryLimitError as exc: raise HTTPException(status_code=422, detail="There is too much history for this period. Choose a shorter period.") from exc except JellystatError as exc: raise HTTPException(status_code=502, detail="Your viewing stats are temporarily unavailable. Please try again shortly.") from exc