|
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 |