Files
BitrixDealsBot/apps/site/config.py
T

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),
)