"""Application configuration. Centralizes environment-driven Flask config and app-wide constants so they can be imported by the app factory, services, and route modules without each reaching into ``os.getenv`` independently. """ import os from dotenv import load_dotenv # Load .env once when the config module is imported. load_dotenv() class Config: """Flask configuration loaded from the environment.""" SECRET_KEY = os.getenv("SECRET_KEY", "dev-secret-key-change-in-production") MAX_CONTENT_LENGTH = 16 * 1024 * 1024 # 16MB max request body (avatar uploads) ALLOW_ANONYMOUS_ACCESS = os.getenv("ALLOW_ANONYMOUS_ACCESS", "true").lower() == "true" # Branding APP_NAME = os.getenv("APP_NAME", "BalanceBoard") LOGO_PATH = os.getenv("LOGO_PATH", "logo.png") # Auth0 (optional; empty disables OAuth login) AUTH0_DOMAIN = os.getenv("AUTH0_DOMAIN", "") AUTH0_CLIENT_ID = os.getenv("AUTH0_CLIENT_ID", "") AUTH0_CLIENT_SECRET = os.getenv("AUTH0_CLIENT_SECRET", "") AUTH0_AUDIENCE = os.getenv("AUTH0_AUDIENCE", "") # App-wide constants (not Flask config keys). Imported directly by modules. ALLOWED_EXTENSIONS = {"png", "jpg", "jpeg", "gif"} UPLOAD_FOLDER = "static/avatars" MAX_FILENAME_LENGTH = 100 DEFAULT_PORT = 5021 DEFAULT_PAGE_SIZE = 20 MIN_PASSWORD_LENGTH = 8 MAX_USERNAME_LENGTH = 80 MAX_EMAIL_LENGTH = 120 MAX_COMMUNITY_NAME_LENGTH = 100