backend / app /utils /file_management.py
bastienp's picture
feat(security): add an API-Key Mechanism
d60934b
from pathlib import Path
import json
import shutil
from typing import Dict, Any
from app.core.logging import LoggerMixin
class FileManager(LoggerMixin):
BASE_DATA_DIR = Path("data")
DEFAULT_DIR = BASE_DATA_DIR / "default"
@classmethod
def ensure_directories(cls) -> None:
"""Ensure all required directories exist"""
cls.BASE_DATA_DIR.mkdir(exist_ok=True)
cls.DEFAULT_DIR.mkdir(exist_ok=True)
@classmethod
def create_session_directory(cls, session_id: str) -> Path:
"""Create a new directory for the session"""
session_dir = cls.BASE_DATA_DIR / session_id
session_dir.mkdir(exist_ok=True)
return session_dir
@classmethod
def save_session_data(cls, session_id: str, names: Dict, player_details: Dict, wagons: Dict) -> None:
"""Save the three main data files for a session"""
session_dir = cls.create_session_directory(session_id)
logger = cls.get_logger()
# Save each file
files_to_save = {
"names.json": names,
"player_details.json": player_details,
"wagons.json": wagons
}
for filename, data in files_to_save.items():
file_path = session_dir / filename
cls.save_json(file_path, data)
logger.info(f"Saved session data | session_id={session_id} | filename={filename} | path={file_path}")
@classmethod
def get_data_directory(cls, session_id: str, default_game: bool) -> Path:
"""Get the appropriate data directory based on default_game flag"""
if default_game:
return cls.DEFAULT_DIR
return cls.BASE_DATA_DIR / session_id
@classmethod
def load_session_data(cls, session_id: str, default_game: bool = True) -> tuple[Dict, Dict, Dict]:
"""Load all data files for a session"""
logger = cls.get_logger()
data_dir = cls.get_data_directory(session_id, default_game)
if not data_dir.exists():
logger.error(f"Data directory not found | session_id={session_id} | directory={data_dir}")
raise FileNotFoundError(f"No data found for session {session_id}")
try:
names = cls.load_json(data_dir / "names.json")
player_details = cls.load_json(data_dir / "player_details.json")
wagons = cls.load_json(data_dir / "wagons.json")
logger.info(
f"Loaded session data | session_id={session_id} | "
f"source={'default' if default_game else 'session'} | "
f"directory={data_dir}"
)
return names, player_details, wagons
except FileNotFoundError as e:
logger.error(f"Failed to load files | session_id={session_id} | directory={data_dir} | error={str(e)}")
raise FileNotFoundError(f"Missing required data files in {data_dir}")
@staticmethod
def save_json(file_path: Path, data: Dict[str, Any]) -> None:
"""Save data to a JSON file"""
with open(file_path, 'w') as f:
json.dump(data, f, indent=2)
@staticmethod
def load_json(file_path: Path) -> Dict:
"""Load data from a JSON file"""
with open(file_path, 'r') as f:
return json.load(f)