from pydantic_settings import BaseSettings from typing import Optional from pathlib import Path from dotenv import load_dotenv import os app_env = os.getenv("APP_ENV", "local") env_filename = f".env.{app_env}" base_path = Path(__file__).resolve().parent.parent.parent backend_path = Path(__file__).resolve().parent.parent load_dotenv(dotenv_path=base_path / '.env') load_dotenv(dotenv_path=backend_path / '.env') if (base_path / env_filename).exists(): load_dotenv(dotenv_path=base_path / env_filename, override=True) if (backend_path / env_filename).exists(): load_dotenv(dotenv_path=backend_path / env_filename, override=True) class Settings(BaseSettings): PROJECT_NAME: str VERSION: str # FastAPI PORT: int HOST: str APP_ENV: str SECRET_KEY: str ALLOWED_HOSTS: str = "*" # Frontend FRONTEND_URL: str CORS_ALLOWED_ORIGINS: Optional[str] = None CORS_ALLOW_ORIGIN_REGEX: Optional[str] = None # Security ENCRYPTION_KEY: Optional[str] = None BCRYPT_ROUNDS: int = 12 # Database settings DATABASE_URL: str DB_SSL: bool = False # Redis Configuration REDIS_HOST: str REDIS_PORT: int REDIS_PASSWORD: Optional[str] REDIS_DB: int = 0 REDIS_ENABLED: bool = True REDIS_TIMEOUT: int = 10 REDIS_MAX_CONNECTIONS: int = 10 @property def REDIS_URL(self) -> str: if self.REDIS_PASSWORD: return f"redis://:{self.REDIS_PASSWORD}@{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}" return f"redis://{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}" # Email SMTP_HOST: str SMTP_PORT: int SMTP_SECURE: bool = True SMTP_USER: str SMTP_PASSWORD: str EMAIL_FROM: str # JWT settings ACCESS_TOKEN_SECRET: str ACCESS_TOKEN_EXPIRES: int = 900 REFRESH_TOKEN_SECRET: str REFRESH_TOKEN_EXPIRES: int = 864000 JWT_ALGORITHM: str = "HS256" # Super Admin Setup SUPER_ADMIN_EMAIL: str SUPER_ADMIN_PASSWORD: str SUPER_ADMIN_FIRST_NAME: str = "Super" SUPER_ADMIN_LAST_NAME: str = "Admin" # Module Integration Security (RS256) SAAS_PRIVATE_KEY: Optional[str] = None SAAS_KEY_ID: str = "saas-key-v1" # PayPal Integration PAYPAL_CLIENT_ID: str PAYPAL_CLIENT_SECRET: str PAYPAL_MODE: str = "sandbox" PAYPAL_API_URL: str = "https://api-m.sandbox.paypal.com" REDIS_CHAT_TTL: int = 86400 LOG_LEVEL: str = "info" @property def MAIL_USERNAME(self) -> str: return self.SMTP_USER @property def MAIL_PASSWORD(self) -> str: return self.SMTP_PASSWORD @property def MAIL_PORT(self) -> int: return self.SMTP_PORT @property def MAIL_SERVER(self) -> str: return self.SMTP_HOST @property def MAIL_FROM(self) -> str: return self.EMAIL_FROM model_config = { "case_sensitive": True, "extra": "ignore", } settings = Settings()