|
from fastapi import APIRouter, HTTPException |
|
from app.services.generate_train.generate_train import GenerateTrainService |
|
from app.models.train import GenerateTrainResponse |
|
from app.utils.file_management import FileManager |
|
from app.core.logging import get_logger |
|
from app.services.session_service import SessionService |
|
import json |
|
|
|
|
|
router = APIRouter( |
|
prefix="/api/generate", |
|
tags=["train-generation"] |
|
) |
|
|
|
logger = get_logger("generate") |
|
|
|
@router.get("/train/{session_id}/{number_of_wagons}/{theme}") |
|
async def get_generated_train( |
|
session_id: str, |
|
number_of_wagons: str, |
|
theme: str |
|
): |
|
""" |
|
Generate a new train with specified parameters for a session. |
|
|
|
- Validates the session exists |
|
- Creates wagons with theme-appropriate passcodes |
|
- Generates passengers with names and profiles |
|
- Stores the generated data for the session |
|
- Returns the complete train data structure |
|
""" |
|
session = SessionService.get_session(session_id) |
|
if not session: |
|
raise HTTPException(status_code=404, detail="Session not found") |
|
|
|
try: |
|
number_of_wagons = int(number_of_wagons) |
|
except ValueError: |
|
raise HTTPException(status_code=400, detail="number_of_wagons must be an integer") |
|
|
|
if number_of_wagons <= 0: |
|
raise HTTPException(status_code=400, detail="number_of_wagons must be greater than 0") |
|
|
|
if number_of_wagons > 6: |
|
raise HTTPException(status_code=400, detail="number_of_wagons cannot exceed 6") |
|
|
|
try: |
|
generate_train_service = GenerateTrainService() |
|
names_data, player_details_data, wagons_data = generate_train_service.generate_train(theme, number_of_wagons) |
|
|
|
|
|
FileManager.save_session_data(session_id, names_data, player_details_data, wagons_data) |
|
|
|
|
|
response = { |
|
"names": names_data, |
|
"player_details": player_details_data, |
|
"wagons": wagons_data |
|
} |
|
|
|
logger.info(f"Setting default_game to False | session_id={session_id}") |
|
session.default_game = False |
|
SessionService.update_session(session) |
|
return response |
|
|
|
except Exception as e: |
|
logger.error(f"Failed to generate train for session {session_id}: {str(e)}") |
|
raise HTTPException(status_code=500, detail=f"Failed to generate train: {str(e)}") |
|
|