Source code for utils.services.data_manager

"""
Gestionnaire de donnĂ©es centralisĂ© pour Ă©viter les requĂȘtes multiples
"""

from typing import Dict, Any, List, Optional, Tuple
from utils.api import Api
from utils.api.exceptions import UsersFetchError, VMsFetchError
from utils.logging_config import get_logger

logger = get_logger(__name__)


[docs] class DataManager: """Gestionnaire centralisĂ© des donnĂ©es pour Ă©viter les requĂȘtes multiples"""
[docs] def __init__(self, api_client: Api): """ Initialise le gestionnaire de données Args: api_client: Client API unifié """ self.api = api_client self._users_cache: Optional[List[Dict[str, Any]]] = None self._vms_cache: Optional[List[Dict[str, Any]]] = None self._data_fetched = False
[docs] def fetch_all_data(self) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]: """ RécupÚre toutes les données nécessaires (utilisateurs et VMs) en une seule fois Returns: Tuple contenant (users, vms) ou ([], []) en cas d'erreur """ if self._data_fetched: logger.info("Utilisation des données en cache") return self._users_cache or [], self._vms_cache or [] logger.info("Début de récupération centralisée des données") # Récupération des utilisateurs try: self._users_cache = self.api.users.get() logger.info("Utilisateurs récupérés", count=len(self._users_cache)) except UsersFetchError as e: logger.error("Impossible de récupérer les utilisateurs", error=str(e)) self._users_cache = [] # Récupération des VMs try: self._vms_cache = self.api.vms.get() logger.info("VMs récupérées", count=len(self._vms_cache)) except VMsFetchError as e: logger.error("Impossible de récupérer les VMs", error=str(e)) self._vms_cache = [] self._data_fetched = True logger.info("Récupération centralisée des données terminée") return self._users_cache or [], self._vms_cache or []
[docs] def get_users(self) -> List[Dict[str, Any]]: """ Retourne les utilisateurs (doit ĂȘtre appelĂ© aprĂšs fetch_all_data) Returns: Liste des utilisateurs """ if not self._data_fetched: raise RuntimeError("fetch_all_data() doit ĂȘtre appelĂ© avant get_users()") return self._users_cache or []
[docs] def get_vms(self) -> List[Dict[str, Any]]: """ Retourne les VMs (doit ĂȘtre appelĂ© aprĂšs fetch_all_data) Returns: Liste des VMs """ if not self._data_fetched: raise RuntimeError("fetch_all_data() doit ĂȘtre appelĂ© avant get_vms()") return self._vms_cache or []
[docs] def get_users_with_vms(self) -> List[Dict[str, Any]]: """ Retourne les utilisateurs avec leurs VMs associées Returns: Liste des utilisateurs avec leurs VMs """ users = self.get_users() vms = self.get_vms() # Associer les VMs aux utilisateurs self.api.users.add_vms_to_users(users, vms) return users
[docs] def clear_cache(self) -> None: """Vide le cache des données""" self._users_cache = None self._vms_cache = None self._data_fetched = False logger.info("Cache des données vidé")
@property def is_data_loaded(self) -> bool: """Indique si les données sont chargées""" return self._data_fetched