fix: Exclude deprecated pitcher_injury field from player responses #2
@ -24,6 +24,8 @@ async def get_players(
|
|||||||
strat_code: list = Query(default=None),
|
strat_code: list = Query(default=None),
|
||||||
is_injured: Optional[bool] = None,
|
is_injured: Optional[bool] = None,
|
||||||
sort: Optional[str] = None,
|
sort: Optional[str] = None,
|
||||||
|
limit: Optional[int] = Query(default=None, ge=1, description="Maximum number of results to return"),
|
||||||
|
offset: Optional[int] = Query(default=None, ge=0, description="Number of results to skip for pagination"),
|
||||||
short_output: Optional[bool] = False,
|
short_output: Optional[bool] = False,
|
||||||
csv: Optional[bool] = False,
|
csv: Optional[bool] = False,
|
||||||
):
|
):
|
||||||
@ -36,6 +38,8 @@ async def get_players(
|
|||||||
name=name,
|
name=name,
|
||||||
is_injured=is_injured,
|
is_injured=is_injured,
|
||||||
sort=sort,
|
sort=sort,
|
||||||
|
limit=limit,
|
||||||
|
offset=offset,
|
||||||
short_output=short_output or False,
|
short_output=short_output or False,
|
||||||
as_csv=csv or False
|
as_csv=csv or False
|
||||||
)
|
)
|
||||||
|
|||||||
@ -38,6 +38,9 @@ class PlayerService(BaseService):
|
|||||||
|
|
||||||
cache_patterns = ["players*", "players-search*", "player*", "team-roster*"]
|
cache_patterns = ["players*", "players-search*", "player*", "team-roster*"]
|
||||||
|
|
||||||
|
# Deprecated fields to exclude from player responses
|
||||||
|
EXCLUDED_FIELDS = ['pitcher_injury']
|
||||||
|
|
||||||
# Class-level repository for dependency injection
|
# Class-level repository for dependency injection
|
||||||
_injected_repo: Optional[AbstractPlayerRepository] = None
|
_injected_repo: Optional[AbstractPlayerRepository] = None
|
||||||
|
|
||||||
@ -87,6 +90,8 @@ class PlayerService(BaseService):
|
|||||||
name: Optional[str] = None,
|
name: Optional[str] = None,
|
||||||
is_injured: Optional[bool] = None,
|
is_injured: Optional[bool] = None,
|
||||||
sort: Optional[str] = None,
|
sort: Optional[str] = None,
|
||||||
|
limit: Optional[int] = None,
|
||||||
|
offset: Optional[int] = None,
|
||||||
short_output: bool = False,
|
short_output: bool = False,
|
||||||
as_csv: bool = False,
|
as_csv: bool = False,
|
||||||
) -> Dict[str, Any]:
|
) -> Dict[str, Any]:
|
||||||
@ -101,6 +106,8 @@ class PlayerService(BaseService):
|
|||||||
name: Filter by name (exact match)
|
name: Filter by name (exact match)
|
||||||
is_injured: Filter by injury status
|
is_injured: Filter by injury status
|
||||||
sort: Sort order
|
sort: Sort order
|
||||||
|
limit: Maximum number of results to return
|
||||||
|
offset: Number of results to skip for pagination
|
||||||
short_output: Exclude related data
|
short_output: Exclude related data
|
||||||
as_csv: Return as CSV format
|
as_csv: Return as CSV format
|
||||||
|
|
||||||
@ -131,11 +138,24 @@ class PlayerService(BaseService):
|
|||||||
# Convert to list of dicts
|
# Convert to list of dicts
|
||||||
players_data = cls._query_to_player_dicts(query, short_output)
|
players_data = cls._query_to_player_dicts(query, short_output)
|
||||||
|
|
||||||
|
# Store total count before pagination
|
||||||
|
total_count = len(players_data)
|
||||||
|
|
||||||
|
# Apply pagination (offset and limit)
|
||||||
|
if offset is not None:
|
||||||
|
players_data = players_data[offset:]
|
||||||
|
if limit is not None:
|
||||||
|
players_data = players_data[:limit]
|
||||||
|
|
||||||
# Return format
|
# Return format
|
||||||
if as_csv:
|
if as_csv:
|
||||||
return cls._format_player_csv(players_data)
|
return cls._format_player_csv(players_data)
|
||||||
else:
|
else:
|
||||||
return {"count": len(players_data), "players": players_data}
|
return {
|
||||||
|
"count": len(players_data),
|
||||||
|
"total": total_count,
|
||||||
|
"players": players_data
|
||||||
|
}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error fetching players: {e}")
|
logger.error(f"Error fetching players: {e}")
|
||||||
@ -322,19 +342,10 @@ class PlayerService(BaseService):
|
|||||||
if first_item is None:
|
if first_item is None:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
# If items are already dicts (from mock)
|
# Convert all items through _player_to_dict to ensure filtering
|
||||||
if isinstance(first_item, dict):
|
|
||||||
players_data = list(query)
|
|
||||||
if short_output:
|
|
||||||
return players_data
|
|
||||||
# Add computed fields if needed
|
|
||||||
return players_data
|
|
||||||
|
|
||||||
# If items are DB models (from real repo)
|
|
||||||
|
|
||||||
players_data = []
|
players_data = []
|
||||||
for player in query:
|
for player in query:
|
||||||
player_dict = model_to_dict(player, recurse=not short_output)
|
player_dict = cls._player_to_dict(player, recurse=not short_output)
|
||||||
players_data.append(player_dict)
|
players_data.append(player_dict)
|
||||||
|
|
||||||
return players_data
|
return players_data
|
||||||
@ -434,17 +445,20 @@ class PlayerService(BaseService):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _player_to_dict(cls, player, recurse: bool = True) -> Dict[str, Any]:
|
def _player_to_dict(cls, player, recurse: bool = True) -> Dict[str, Any]:
|
||||||
"""Convert player to dict."""
|
"""Convert player to dict, excluding deprecated fields."""
|
||||||
# If already a dict, return as-is
|
# If already a dict, filter and return
|
||||||
if isinstance(player, dict):
|
if isinstance(player, dict):
|
||||||
return player
|
return {k: v for k, v in player.items() if k not in cls.EXCLUDED_FIELDS}
|
||||||
|
|
||||||
# Try to convert Peewee model
|
# Try to convert Peewee model
|
||||||
try:
|
try:
|
||||||
return model_to_dict(player, recurse=recurse)
|
player_dict = model_to_dict(player, recurse=recurse)
|
||||||
|
# Filter out excluded fields
|
||||||
|
return {k: v for k, v in player_dict.items() if k not in cls.EXCLUDED_FIELDS}
|
||||||
except ImportError:
|
except ImportError:
|
||||||
# Fall back to basic dict conversion
|
# Fall back to basic dict conversion
|
||||||
return dict(player)
|
player_dict = dict(player)
|
||||||
|
return {k: v for k, v in player_dict.items() if k not in cls.EXCLUDED_FIELDS}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def update_player(
|
def update_player(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user