import json import os from pathlib import Path from dotenv import load_dotenv backend_dir = Path(__file__).resolve().parent.parent load_dotenv(backend_dir / ".env") def _get_int_env(name: str, default: int) -> int: value = os.getenv(name, "").strip() if not value: return default try: return int(value) except ValueError: return default def _get_bool_env(name: str, default: bool = False) -> bool: value = os.getenv(name) if value is None: return default return value.strip().lower() in {"1", "true", "yes", "on"} def _get_list_env(name: str, default: list[str]) -> list[str]: value = os.getenv(name, "").strip() if not value: return default try: parsed = json.loads(value) except json.JSONDecodeError: parsed = None if isinstance(parsed, list): return [str(item).strip() for item in parsed if str(item).strip()] return [item.strip() for item in value.split(",") if item.strip()] def _get_path_env(name: str, default: Path) -> Path: value = os.getenv(name, "").strip() if not value: return default.resolve() path = Path(value) if not path.is_absolute(): path = backend_dir / path return path.resolve() class Settings: app_name = os.getenv("APP_NAME", "HTML Knowledge API") api_prefix = os.getenv("API_PREFIX", "/api").rstrip("/") or "/api" backend_dir = backend_dir data_dir = backend_dir / "data" database_path = data_dir / "html_generator.db" database_url = f"sqlite:///{database_path.as_posix()}" allowed_origins = _get_list_env("ALLOWED_ORIGINS", ["*"]) public_base_url = os.getenv("PUBLIC_BASE_URL", "http://localhost:8000").rstrip("/") html_storage_dir = _get_path_env( "HTML_STORAGE_DIR", data_dir / "generated_html", ) default_retention_days = max(1, _get_int_env("DEFAULT_RETENTION_DAYS", 7)) max_retention_days = max( default_retention_days, _get_int_env("MAX_RETENTION_DAYS", 30), ) max_html_length = max(1024, _get_int_env("MAX_HTML_LENGTH", 200_000)) api_key = os.getenv("API_KEY", "").strip() allow_unsafe_html = _get_bool_env("ALLOW_UNSAFE_HTML", False) strip_markdown_code_fence = _get_bool_env("STRIP_MARKDOWN_CODE_FENCE", True) enable_request_debug_log = _get_bool_env("ENABLE_REQUEST_DEBUG_LOG", True) request_log_max_chars = max(256, _get_int_env("REQUEST_LOG_MAX_CHARS", 10_000)) settings = Settings()