import os import secrets from pathlib import Path from typing import List, Union, Optional from pydantic import EmailStr, validator from pydantic_settings import BaseSettings class Settings(BaseSettings): # Project settings PROJECT_NAME: str = "Deft Trade" PROJECT_DESCRIPTION: str = "DeFi Trading Simulation Platform" VERSION: str = "0.1.0" API_V1_STR: str = "/api/v1" # Security settings SECRET_KEY: str = os.environ.get("SECRET_KEY") or secrets.token_urlsafe(32) JWT_SECRET_KEY: str = os.environ.get("JWT_SECRET_KEY") or secrets.token_urlsafe(32) ACCESS_TOKEN_EXPIRE_MINUTES: int = int(os.environ.get("ACCESS_TOKEN_EXPIRE_MINUTES", 30)) REFRESH_TOKEN_EXPIRE_DAYS: int = int(os.environ.get("REFRESH_TOKEN_EXPIRE_DAYS", 7)) ALGORITHM: str = "HS256" # CORS settings BACKEND_CORS_ORIGINS: List[str] = ["*"] @validator("BACKEND_CORS_ORIGINS", pre=True) def assemble_cors_origins(cls, v: Union[str, List[str]]) -> Union[List[str], str]: if isinstance(v, str) and not v.startswith("["): return [i.strip() for i in v.split(",")] elif isinstance(v, (list, str)): return v raise ValueError(v) # Database DB_DIR: Path = Path("/app") / "storage" / "db" # Email settings EMAILS_ENABLED: bool = os.environ.get("EMAILS_ENABLED", "False").lower() == "true" SMTP_TLS: bool = os.environ.get("SMTP_TLS", "True").lower() == "true" SMTP_PORT: Optional[int] = int(os.environ.get("SMTP_PORT", 587)) if os.environ.get("SMTP_PORT") else None SMTP_HOST: Optional[str] = os.environ.get("SMTP_HOST") SMTP_USER: Optional[str] = os.environ.get("SMTP_USER") SMTP_PASSWORD: Optional[str] = os.environ.get("SMTP_PASSWORD") EMAILS_FROM_EMAIL: Optional[EmailStr] = os.environ.get("EMAILS_FROM_EMAIL") EMAILS_FROM_NAME: Optional[str] = os.environ.get("EMAILS_FROM_NAME") # File upload UPLOAD_DIR: Path = Path("/app") / "storage" / "uploads" KYC_UPLOAD_DIR: Path = Path("/app") / "storage" / "kyc" DEPOSIT_PROOFS_DIR: Path = Path("/app") / "storage" / "deposit_proofs" MAX_UPLOAD_SIZE: int = int(os.environ.get("MAX_UPLOAD_SIZE", 5 * 1024 * 1024)) # 5 MB default # Admin default settings ADMIN_EMAIL: EmailStr = os.environ.get("ADMIN_EMAIL", "admin@defttrade.com") ADMIN_PASSWORD: str = os.environ.get("ADMIN_PASSWORD", "change-me-please") # 2FA settings TWO_FACTOR_REQUIRED: bool = os.environ.get("TWO_FACTOR_REQUIRED", "False").lower() == "true" # Bot simulation settings BOT_SIMULATION_INTERVAL: int = int(os.environ.get("BOT_SIMULATION_INTERVAL", 60)) # Seconds # Transaction settings MIN_DEPOSIT_AMOUNT: float = float(os.environ.get("MIN_DEPOSIT_AMOUNT", 10.0)) MIN_WITHDRAWAL_AMOUNT: float = float(os.environ.get("MIN_WITHDRAWAL_AMOUNT", 10.0)) WITHDRAWAL_FEE_PERCENTAGE: float = float(os.environ.get("WITHDRAWAL_FEE_PERCENTAGE", 1.0)) class Config: case_sensitive = True env_file = ".env" settings = Settings()