""" Application configuration management. Uses pydantic-settings for typed configuration with environment variable overrides. """ from pydantic_settings import BaseSettings from typing import Optional from functools import lru_cache class Settings(BaseSettings): """Application settings loaded from environment variables or .env file.""" # Application APP_NAME: str = "MTG Online" APP_VERSION: str = "0.2.0" DEBUG: bool = False SECRET_KEY: str = "change-me-in-production" JWT_SECRET_KEY: str = "change-me-in-production" # Database - Primary (mtgonline app) DATABASE_URL: str = "postgresql+asyncpg://postgres:postgres@localhost:5432/mtgo_platform" # Database - Secondary (mtgjson data) MTG_DATABASE_URL: str = "postgresql+asyncpg://postgres:postgres@localhost:5432/mtg_data" # Redis REDIS_URL: str = "redis://localhost:6379/0" # JWT Configuration JWT_ALGORITHM: str = "HS256" JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 JWT_REFRESH_TOKEN_EXPIRE_DAYS: int = 7 # CORS CORS_ORIGINS: list[str] = ["http://localhost:3000", "http://localhost:8000"] # Email (for password reset, account activation) SMTP_HOST: Optional[str] = None SMTP_PORT: int = 587 SMTP_USER: Optional[str] = None SMTP_PASSWORD: Optional[str] = None EMAIL_FROM: Optional[str] = None # Security BCRYPT_ROUNDS: int = 12 MAX_LOGIN_ATTEMPTS: int = 5 LOGIN_BLOCK_MINUTES: int = 15 # MTG Data Refresh MTG_REFRESH_INTERVAL_DAYS: int = 7 DATA_DIR: str = "/app/data" UPLOAD_DIR: str = "/app/uploads" # Database configuration DB_CONFIG: dict = { "engine": "postgresql+asyncpg", "user": "mtgonline", "password": "mtgonline_pass", "host": "postgres", "port": 5432, } # Logging LOG_LEVEL: str = "INFO" # Redis configuration REDIS_CONFIG: dict = { "host": "redis", "port": 6379, "db": 0, } class Config: env_file = ".env" env_file_encoding = "utf-8" extra = "allow" # Allow extra env vars @lru_cache() def get_settings() -> Settings: """Get cached application settings.""" return Settings()