35 lines
1.3 KiB
Python
35 lines
1.3 KiB
Python
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
|
|
|
|
router = APIRouter(prefix="/insights", tags=["insights"])
|
|
|
|
|
|
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
|