"""Application configuration from environment variables.""" from functools import lru_cache from typing import Optional from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore", env_prefix="", ) DATABASE_URL: str = "" SITE_TITLE: str = "TiDB Community Slack" SITE_DESCRIPTION: str = "Join the TiDB Community on Slack." SENTRY_DSN: str = "" ENVIRONMENT: str = "development" REDIS_URL: str = "redis://localhost:6379/0" ADMIN_EMAIL: Optional[str] = None # Google OAuth GOOGLE_CLIENT_ID: str = "" GOOGLE_CLIENT_SECRET: str = "" SESSION_SECRET: str = "change-me-to-a-very-long-random-string-in-production" @property def jwt_secret(self) -> str: """Ensures the secret is at least 32 bytes for SHA256.""" if len(self.SESSION_SECRET) < 32: import hashlib return hashlib.sha256(self.SESSION_SECRET.encode()).hexdigest() return self.SESSION_SECRET # Only users with this email domain are allowed to access /admin. # Leave empty to allow any logged-in user. ADMIN_EMAIL_DOMAIN: str = "" # Public base URL used for OAuth redirect_uri (e.g. https://slack.tidb.io) # Falls back to request base URL when empty (suitable for local dev) BASE_URL: str = "" @property def sqlalchemy_database_uri(self) -> str: return self.DATABASE_URL or "" @lru_cache def get_settings() -> Settings: return Settings()