import os from pydantic import Field, SecretStr from pydantic_settings import BaseSettings, SettingsConfigDict class DatabaseSettings(BaseSettings): host: str = "postgres" port: int = 5432 user: str = "beavergram" password: SecretStr = SecretStr("beavergram") db_name: str = "beavergram" min_pool_size: int = 5 max_pool_size: int = 20 scripts_connection_url: str = ( "postgresql://beavergram:beavergram@localhost:5433/beavergram" ) @property def connection_url(self) -> str: if os.getenv("RUN_ENVIRONMENT") != "prod": return self.scripts_connection_url return ( f"postgresql://{self.user}:{self.password.get_secret_value()}" f"@{self.host}:{self.port}/{self.db_name}" ) class TelegramSettings(BaseSettings): session_name: str = "beavergram" sessions_dir: str = "sessions" class ApiSettings(BaseSettings): host: str = "0.0.0.0" # noqa: S104 port: int = 8080 class AuthSettings(BaseSettings): token: SecretStr | None = None class StorageSettings(BaseSettings): root: str = "storage" shard_depth: int = 2 class LogSettings(BaseSettings): level: str = "INFO" level_external: str = "WARNING" show_time: bool = False console_width: int = 150 class Settings(BaseSettings): db: DatabaseSettings = Field(default_factory=DatabaseSettings) tg: TelegramSettings = Field(default_factory=TelegramSettings) api: ApiSettings = Field(default_factory=ApiSettings) auth: AuthSettings = Field(default_factory=AuthSettings) storage: StorageSettings = Field(default_factory=StorageSettings) log: LogSettings = Field(default_factory=LogSettings) model_config = SettingsConfigDict( case_sensitive=False, env_file=".env", env_nested_delimiter="__", extra="ignore" ) env = Settings()