58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
import os
|
|
from dataclasses import dataclass
|
|
from urllib.parse import urlparse
|
|
|
|
|
|
def _required(name: str) -> str:
|
|
value = os.getenv(name)
|
|
if not value:
|
|
raise RuntimeError(f"{name} is not set")
|
|
return value
|
|
|
|
|
|
def _as_bool(value: str | None, default: bool = False) -> bool:
|
|
if value is None:
|
|
return default
|
|
return value.lower() in {"1", "true", "yes", "on"}
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class SiteConfig:
|
|
"""Настройки HTTP-приложения."""
|
|
|
|
database_url: str
|
|
public_base_url: str
|
|
bot_username: str
|
|
token_encryption_key: str
|
|
bitrix_client_id: str
|
|
bitrix_client_secret: str
|
|
oauth_token_url: str
|
|
binding_ttl_seconds: int = 600
|
|
trust_proxy: bool = True
|
|
|
|
@classmethod
|
|
def from_env(cls) -> "SiteConfig":
|
|
public_base_url = _required("PUBLIC_BASE_URL").rstrip("/")
|
|
parsed_url = urlparse(public_base_url)
|
|
if parsed_url.scheme not in {"http", "https"} or not parsed_url.netloc:
|
|
raise RuntimeError("PUBLIC_BASE_URL must be an absolute URL")
|
|
|
|
ttl = int(os.getenv("BINDING_TOKEN_TTL_SECONDS", "600"))
|
|
if not 60 <= ttl <= 3600:
|
|
raise RuntimeError("BINDING_TOKEN_TTL_SECONDS must be 60..3600")
|
|
|
|
return cls(
|
|
database_url=_required("DATABASE_URL"),
|
|
public_base_url=public_base_url,
|
|
bot_username=_required("BOT_USERNAME").lstrip("@"),
|
|
token_encryption_key=_required("TOKEN_ENCRYPTION_KEY"),
|
|
bitrix_client_id=_required("BITRIX_CLIENT_ID"),
|
|
bitrix_client_secret=_required("BITRIX_CLIENT_SECRET"),
|
|
oauth_token_url=os.getenv(
|
|
"BITRIX_OAUTH_TOKEN_URL",
|
|
"https://oauth.bitrix.info/oauth/token/",
|
|
),
|
|
binding_ttl_seconds=ttl,
|
|
trust_proxy=_as_bool(os.getenv("TRUST_PROXY"), default=True),
|
|
)
|