Files
saas_backend/app/config/settings.py
T

121 lines
2.9 KiB
Python

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 = 86400
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()