Merge pull request 'fix: refresh roster data before validation to prevent stale cache' (#60) from hotfix/stale-roster-cache into next-release

Reviewed-on: #60
This commit is contained in:
cal 2026-03-02 21:06:59 +00:00
commit bc8a256b14
2 changed files with 390 additions and 315 deletions

View File

@ -14,7 +14,7 @@ from models.transaction import Transaction
from models.team import Team
from models.player import Player
from models.roster import TeamRoster
from services.roster_service import roster_service
from services.roster_service import RosterService, roster_service
from services.transaction_service import transaction_service
from services.league_service import league_service
from models.team import RosterType
@ -174,7 +174,13 @@ class RosterValidationResult:
class TransactionBuilder:
"""Interactive transaction builder for complex multi-move transactions."""
def __init__(self, team: Team, user_id: int, season: int = get_config().sba_season):
def __init__(
self,
team: Team,
user_id: int,
season: int = get_config().sba_season,
roster_svc: Optional[RosterService] = None,
):
"""
Initialize transaction builder.
@ -182,12 +188,14 @@ class TransactionBuilder:
team: Team making the transaction
user_id: Discord user ID of the GM
season: Season number
roster_svc: RosterService instance (defaults to global roster_service)
"""
self.team = team
self.user_id = user_id
self.season = season
self.moves: List[TransactionMove] = []
self.created_at = datetime.now(timezone.utc)
self._roster_svc = roster_svc or roster_service
# Cache for roster data
self._current_roster: Optional[TeamRoster] = None
@ -201,13 +209,19 @@ class TransactionBuilder:
f"TransactionBuilder initialized for {team.abbrev} by user {user_id}"
)
async def load_roster_data(self) -> None:
"""Load current roster data for the team."""
if self._roster_loaded:
async def load_roster_data(self, force_refresh: bool = False) -> None:
"""Load current roster data for the team.
Args:
force_refresh: If True, bypass cache and fetch fresh data from API.
"""
if self._roster_loaded and not force_refresh:
return
try:
self._current_roster = await roster_service.get_current_roster(self.team.id)
self._current_roster = await self._roster_svc.get_current_roster(
self.team.id
)
self._roster_loaded = True
logger.debug(f"Loaded roster data for team {self.team.abbrev}")
except Exception as e:
@ -678,8 +692,17 @@ class TransactionBuilder:
logger.info(
f"Created {len(transactions)} transactions for submission with move_id {move_id}"
)
# Invalidate roster cache so subsequent operations fetch fresh data
self.invalidate_roster_cache()
return transactions
def invalidate_roster_cache(self) -> None:
"""Invalidate cached roster data so next load fetches fresh data."""
self._roster_loaded = False
self._current_roster = None
def clear_moves(self) -> None:
"""Clear all moves from the transaction builder."""
self.moves.clear()

File diff suppressed because it is too large Load Diff