From add175e5280e0bc65b88124e2341fe16ca21022f Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Tue, 31 Mar 2026 01:22:37 -0500 Subject: [PATCH] fix: auto-initialize RefractorCardState in evaluate-game for legacy cards Cards created before the refractor system was deployed have no RefractorCardState row. Previously evaluate-game silently skipped these players. Now it calls initialize_card_refractor on-the-fly so any card used in a game gets refractor tracking regardless of when it was created. Co-Authored-By: Claude Opus 4.6 (1M context) --- app/routers_v2/refractor.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/routers_v2/refractor.py b/app/routers_v2/refractor.py index 0b1c78d..ba9c4c5 100644 --- a/app/routers_v2/refractor.py +++ b/app/routers_v2/refractor.py @@ -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. -- 2.25.1