Skip to content

Commit 12eaff0

Browse files
nanotaboadaCopilotclaude
committed
refactor(api): address review feedback on route and service layer (#521)
- Use Annotated for FastAPI Path/Body/Depends across all route handlers - Define SQUAD_NUMBER_TITLE constant to avoid literal duplication - Enforce path param as canonical key in update_by_squad_number_async - Add None guard and move delete inside try/except in delete_by_squad_number_async Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
1 parent 470fa53 commit 12eaff0

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

routes/player_route.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
- DELETE /players/squadnumber/{squad_number} : Delete an existing Player.
2020
"""
2121

22-
from typing import List
22+
from typing import Annotated, List
2323
from uuid import UUID
2424
from fastapi import APIRouter, Body, Depends, HTTPException, status, Path, Response
2525
from sqlalchemy.ext.asyncio import AsyncSession
@@ -34,6 +34,7 @@
3434

3535
CACHE_KEY = "players"
3636
CACHE_TTL = 600 # 10 minutes
37+
SQUAD_NUMBER_TITLE = "The Squad Number of the Player"
3738

3839
# POST -------------------------------------------------------------------------
3940

@@ -46,8 +47,8 @@
4647
tags=["Players"],
4748
)
4849
async def post_async(
49-
player_model: PlayerRequestModel = Body(...),
50-
async_session: AsyncSession = Depends(generate_async_session),
50+
player_model: Annotated[PlayerRequestModel, Body(...)],
51+
async_session: Annotated[AsyncSession, Depends(generate_async_session)],
5152
):
5253
"""
5354
Endpoint to create a new player.
@@ -89,7 +90,8 @@ async def post_async(
8990
tags=["Players"],
9091
)
9192
async def get_all_async(
92-
response: Response, async_session: AsyncSession = Depends(generate_async_session)
93+
response: Response,
94+
async_session: Annotated[AsyncSession, Depends(generate_async_session)],
9395
):
9496
"""
9597
Endpoint to retrieve all players.
@@ -117,8 +119,8 @@ async def get_all_async(
117119
tags=["Players"],
118120
)
119121
async def get_by_id_async(
120-
player_id: UUID = Path(..., title="The UUID of the Player"),
121-
async_session: AsyncSession = Depends(generate_async_session),
122+
player_id: Annotated[UUID, Path(..., title="The UUID of the Player")],
123+
async_session: Annotated[AsyncSession, Depends(generate_async_session)],
122124
):
123125
"""
124126
Endpoint to retrieve a Player by its UUID.
@@ -148,8 +150,8 @@ async def get_by_id_async(
148150
tags=["Players"],
149151
)
150152
async def get_by_squad_number_async(
151-
squad_number: int = Path(..., title="The Squad Number of the Player"),
152-
async_session: AsyncSession = Depends(generate_async_session),
153+
squad_number: Annotated[int, Path(..., title=SQUAD_NUMBER_TITLE)],
154+
async_session: Annotated[AsyncSession, Depends(generate_async_session)],
153155
):
154156
"""
155157
Endpoint to retrieve a Player by its Squad Number.
@@ -183,9 +185,9 @@ async def get_by_squad_number_async(
183185
tags=["Players"],
184186
)
185187
async def put_async(
186-
squad_number: int = Path(..., title="The Squad Number of the Player"),
187-
player_model: PlayerRequestModel = Body(...),
188-
async_session: AsyncSession = Depends(generate_async_session),
188+
squad_number: Annotated[int, Path(..., title=SQUAD_NUMBER_TITLE)],
189+
player_model: Annotated[PlayerRequestModel, Body(...)],
190+
async_session: Annotated[AsyncSession, Depends(generate_async_session)],
189191
):
190192
"""
191193
Endpoint to entirely update an existing Player.
@@ -226,8 +228,8 @@ async def put_async(
226228
tags=["Players"],
227229
)
228230
async def delete_async(
229-
squad_number: int = Path(..., title="The Squad Number of the Player"),
230-
async_session: AsyncSession = Depends(generate_async_session),
231+
squad_number: Annotated[int, Path(..., title=SQUAD_NUMBER_TITLE)],
232+
async_session: Annotated[AsyncSession, Depends(generate_async_session)],
231233
):
232234
"""
233235
Endpoint to delete an existing Player.

services/player_service.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ async def update_by_squad_number_async(
140140
player.middle_name = player_model.middle_name
141141
player.last_name = player_model.last_name
142142
player.date_of_birth = player_model.date_of_birth
143-
player.squad_number = player_model.squad_number
143+
player.squad_number = squad_number
144144
player.position = player_model.position
145145
player.abbr_position = player_model.abbr_position
146146
player.team = player_model.team
@@ -172,8 +172,11 @@ async def delete_by_squad_number_async(
172172
True if the Player was deleted successfully, False otherwise.
173173
"""
174174
player = await retrieve_by_squad_number_async(async_session, squad_number)
175-
await async_session.delete(player)
175+
if player is None: # pragma: no cover
176+
logger.error("Player not found for delete: squad_number=%s", squad_number)
177+
return False
176178
try:
179+
await async_session.delete(player)
177180
await async_session.commit()
178181
return True
179182
except SQLAlchemyError as error: # pragma: no cover

0 commit comments

Comments
 (0)