""" Database and cache configuration """ import os class MetaRedisConfig(type): """Redis configuration""" @property def HOST(cls): return os.getenv('REDIS_HOST', 'localhost') @property def PORT(cls): return int(os.getenv('REDIS_PORT', 6379)) @property def PASSWORD(cls): return os.getenv('REDIS_PASSWORD', None) @property def DB(cls): return int(os.getenv('REDIS_DB', 0)) @property def CONNECT_TIMEOUT(cls): return int(os.getenv('REDIS_CONNECT_TIMEOUT', 5)) @property def SOCKET_TIMEOUT(cls): return int(os.getenv('REDIS_SOCKET_TIMEOUT', 5)) @property def MAX_CONNECTIONS(cls): return int(os.getenv('REDIS_MAX_CONNECTIONS', 10)) class RedisConfig(metaclass=MetaRedisConfig): """Redis cache configuration.""" @classmethod def get_url(cls) -> str: """Get the Redis connection URL.""" if cls.PASSWORD: return f"redis://:{cls.PASSWORD}@{cls.HOST}:{cls.PORT}/{cls.DB}" return f"redis://{cls.HOST}:{cls.PORT}/{cls.DB}" class MetaCacheConfig(type): """Cache business configuration.""" def ENABLED(cls): # Forced to be off by default unless explicitly enabled by an environment variable return os.getenv('CACHE_ENABLED', 'False').lower() == 'true' @property def DEFAULT_EXPIRE(cls): return int(os.getenv('CACHE_EXPIRE', 300)) @property def KLINE_CACHE_TTL(cls): return { '1m': 5, # K-line cache for 1 minute and 5 seconds '3m': 30, # 3 minutes K-line cache 30 seconds '5m': 60, # 5 minutes K-line cache 1 minute '15m': 300, # 15 minutes K-line cache 5 minutes '30m': 300, # 30 minutes K-line cache 5 minutes '1H': 300, # 1 hour K-line cache for 5 minutes '4H': 300, # 4 hours K-line cache for 5 minutes '1D': 300, # Daily K-line cache for 5 minutes # Compatible with lowercase '1h': 300, '4h': 300, '1d': 300, } @property def ANALYSIS_CACHE_TTL(cls): return 3600 @property def PRICE_CACHE_TTL(cls): return 10 class CacheConfig(metaclass=MetaCacheConfig): """Cache configuration.""" pass