fix: auto-initialize RefractorCardState in evaluate-game #178

Merged
cal merged 1 commits from fix/refractor-auto-init-missing-states into main 2026-03-31 06:25:42 +00:00

View File

@ -6,6 +6,7 @@ from typing import Optional
from ..db_engine import model_to_dict
from ..dependencies import oauth2_scheme, valid_token
from ..services.refractor_init import initialize_card_refractor, _determine_card_type
logger = logging.getLogger(__name__)
@ -302,8 +303,9 @@ async def evaluate_game(game_id: int, token: str = Depends(oauth2_scheme)):
Finds all unique (player_id, team_id) pairs from the game's StratPlay rows,
then for each pair that has a RefractorCardState, re-computes the refractor
tier. Pairs without a state row are silently skipped. Per-player errors are
logged but do not abort the batch.
tier. Pairs without a state row are auto-initialized on-the-fly via
initialize_card_refractor (idempotent). Per-player errors are logged but
do not abort the batch.
"""
if not valid_token(token):
logging.warning("Bad Token: [REDACTED]")
@ -334,7 +336,17 @@ async def evaluate_game(game_id: int, token: str = Depends(oauth2_scheme)):
& (RefractorCardState.team_id == team_id)
)
if state is None:
continue
try:
player = Player.get_by_id(player_id)
card_type = _determine_card_type(player)
state = initialize_card_refractor(player_id, team_id, card_type)
except Exception:
logger.warning(
f"Refractor auto-init failed for player={player_id} "
f"team={team_id} — skipping"
)
if state is None:
continue
old_tier = state.current_tier
# Use dry_run=True so that current_tier is NOT written here.