# /opt/docker/dev/service_finder/backend/app/core/config.py import os from pathlib import Path from typing import Any, Optional, List from pydantic_settings import BaseSettings, SettingsConfigDict from pydantic import Field, field_validator from sqlalchemy import text from sqlalchemy.ext.asyncio import AsyncSession from datetime import datetime, timezone class Settings(BaseSettings): # --- Paths --- BASE_DIR: Path = Path(__file__).resolve().parent.parent.parent STATIC_DIR: str = os.path.join(str(BASE_DIR), "static") # --- General --- PROJECT_NAME: str = "Service Finder Ecosystem" VERSION: str = "2.1.0" API_V1_STR: str = "/api/v1" DEBUG: bool = False def get_now_utc_iso(self) -> str: """Központi időlekérdező az egész Sentinel rendszernek""" return datetime.now(timezone.utc).isoformat() # MB 2.0 Kompatibilitási alias a database.py számára @property def DEBUG_MODE(self) -> bool: return self.DEBUG # --- Security / JWT --- SECRET_KEY: str = "NOT_SET_DANGER" ALGORITHM: str = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 REFRESH_TOKEN_EXPIRE_DAYS: int = 7 # --- Initial Admin --- INITIAL_ADMIN_EMAIL: str = "admin@servicefinder.hu" INITIAL_ADMIN_PASSWORD: str = "Admin123!" # --- Database & Cache --- # Alapértelmezett értéket adunk, hogy ne szálljon el, ha a .env hiányos DATABASE_URL: str = Field( default="postgresql+asyncpg://user:password@postgres-db:5432/service_finder", env="DATABASE_URL" ) REDIS_URL: str = "redis://service_finder_redis:6379/0" @property def SQLALCHEMY_DATABASE_URI(self) -> str: """ Ez a property biztosítja, hogy a database.py és az Alembic megtalálja a kapcsolatot a várt néven. """ return self.DATABASE_URL # --- Email --- EMAIL_PROVIDER: str = "auto" EMAILS_FROM_EMAIL: str = "info@profibot.hu" EMAILS_FROM_NAME: str = "Profibot" SENDGRID_API_KEY: Optional[str] = None SMTP_HOST: Optional[str] = None SMTP_PORT: int = 587 SMTP_USER: Optional[str] = None SMTP_PASSWORD: Optional[str] = None # --- External URLs --- FRONTEND_BASE_URL: str = "https://dev.profibot.hu" BACKEND_CORS_ORIGINS: List[str] = [ "http://localhost:3001", "https://dev.profibot.hu", "http://192.168.100.10:3001" ] # --- Google OAuth --- GOOGLE_CLIENT_ID: str = "" GOOGLE_CLIENT_SECRET: str = "" GOOGLE_CALLBACK_URL: str = "https://dev.profibot.hu/api/v1/auth/callback/google" # --- Brute-Force & Security --- LOGIN_RATE_LIMIT_ANON: str = "5/minute" AUTH_MIN_PASSWORD_LENGTH: int = 8 # --- Dinamikus Admin Motor (Sértetlenül hagyva) --- async def get_db_setting(self, db: AsyncSession, key_name: str, default: Any = None) -> Any: try: query = text("SELECT value FROM data.system_parameters WHERE key = :key") result = await db.execute(query, {"key": key_name}) row = result.fetchone() if row and row[0] is not None: return row[0] return default except Exception: return default model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", case_sensitive=True, extra="ignore" ) settings = Settings()