84 lines
2.4 KiB
Python
84 lines
2.4 KiB
Python
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)
|
|
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()
|