from fastapi import APIRouter from typing import List, Dict, Any import logging from app.services.leaderboard import IcelandicLeaderboardService from app.core.fastapi_cache import cached, build_cache_key logger = logging.getLogger(__name__) router = APIRouter() leaderboard_service = IcelandicLeaderboardService() def leaderboard_key_builder(func, namespace: str = "icelandic_leaderboard", **kwargs): """Build cache key for Icelandic leaderboard data""" key_type = "raw" if func.__name__ == "get_leaderboard" else "formatted" key = build_cache_key(namespace, key_type) logger.debug(f"Built Icelandic leaderboard cache key: {key}") return key @router.get("") @cached(expire=300, key_builder=leaderboard_key_builder) async def get_leaderboard() -> List[Dict[str, Any]]: """ Get raw Icelandic leaderboard data Response will be automatically GZIP compressed if size > 500 bytes """ try: logger.info("Fetching raw Icelandic leaderboard data") data = await leaderboard_service.fetch_raw_data() logger.info(f"Retrieved {len(data)} Icelandic leaderboard entries") return data except Exception as e: logger.error(f"Failed to fetch raw Icelandic leaderboard data: {e}") raise @router.get("/formatted") @cached(expire=300, key_builder=leaderboard_key_builder) async def get_formatted_leaderboard() -> List[Dict[str, Any]]: """ Get formatted Icelandic leaderboard data with restructured objects Response will be automatically GZIP compressed if size > 500 bytes """ try: logger.info("Fetching formatted Icelandic leaderboard data") data = await leaderboard_service.get_formatted_data() logger.info(f"Retrieved {len(data)} formatted Icelandic entries") return data except Exception as e: logger.error(f"Failed to fetch formatted Icelandic leaderboard data: {e}") raise