""" Cache Service - Simple in-memory cache for API responses. Can be extended to use Redis later. """ from typing import Any, Optional from datetime import datetime, timedelta from functools import wraps from ..utils.logger import setup_logger logger = setup_logger(__name__) # Simple in-memory cache _cache: dict = {} _cache_ttl: dict = {} def get(key: str) -> Optional[Any]: """ Retrieves a value from the cache if it exists and hasn't expired. Args: key: Cache key Returns: Cached value or None if not found or expired """ if key not in _cache: return None # Check if expired if key in _cache_ttl: if datetime.now() > _cache_ttl[key]: # Expired, remove it del _cache[key] del _cache_ttl[key] return None return _cache[key] def set(key: str, value: Any, ttl_seconds: int = 86400) -> None: """ Stores a value in the cache with a TTL. Args: key: Cache key value: Value to cache ttl_seconds: Time to live in seconds (default: 24 hours) """ _cache[key] = value _cache_ttl[key] = datetime.now() + timedelta(seconds=ttl_seconds) logger.debug(f"Cached value for key: {key} (TTL: {ttl_seconds}s)") def clear(key: Optional[str] = None) -> None: """ Clears cache entries. Args: key: Specific key to clear, or None to clear all """ if key: if key in _cache: del _cache[key] if key in _cache_ttl: del _cache_ttl[key] logger.debug(f"Cleared cache for key: {key}") else: _cache.clear() _cache_ttl.clear() logger.debug("Cleared all cache") def cached(ttl_seconds: int = 86400): """ Decorator to cache function results. Usage: @cached(ttl_seconds=1800) def expensive_function(arg1, arg2): ... """ def decorator(func): @wraps(func) def wrapper(*args, **kwargs): # Create cache key from function name and arguments cache_key = f"{func.__name__}:{str(args)}:{str(kwargs)}" # Try to get from cache cached_value = get(cache_key) if cached_value is not None: logger.debug(f"Cache hit for {func.__name__}") return cached_value # Call function and cache result result = func(*args, **kwargs) set(cache_key, result, ttl_seconds) return result return wrapper return decorator