From ab90dfc437ca7f8fc77e9af7cecab1374b27306e Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Fri, 27 Mar 2026 06:04:56 -0500 Subject: [PATCH 1/3] fix: replace manual db.close() calls with middleware-based connection management (#71) Closes #71 Co-Authored-By: Claude Sonnet 4.6 --- app/main.py | 13 +++++++++++++ app/routers_v3/awards.py | 9 --------- app/routers_v3/battingstats.py | 8 -------- app/routers_v3/current.py | 5 ----- app/routers_v3/custom_commands.py | 12 ------------ app/routers_v3/decisions.py | 9 --------- app/routers_v3/divisions.py | 10 ---------- app/routers_v3/draftdata.py | 3 --- app/routers_v3/draftlist.py | 4 ---- app/routers_v3/draftpicks.py | 6 ------ app/routers_v3/fieldingstats.py | 6 ------ app/routers_v3/help_commands.py | 10 ---------- app/routers_v3/injuries.py | 8 -------- app/routers_v3/keepers.py | 5 ----- app/routers_v3/managers.py | 9 --------- app/routers_v3/pitchingstats.py | 8 -------- app/routers_v3/results.py | 7 ------- app/routers_v3/sbaplayers.py | 18 ------------------ app/routers_v3/schedules.py | 6 ------ app/routers_v3/standings.py | 5 ----- app/routers_v3/stratgame.py | 10 ---------- app/routers_v3/stratplay/batting.py | 1 - app/routers_v3/stratplay/crud.py | 10 ---------- app/routers_v3/stratplay/fielding.py | 1 - app/routers_v3/stratplay/pitching.py | 1 - app/routers_v3/stratplay/plays.py | 1 - app/routers_v3/transactions.py | 5 ----- 27 files changed, 13 insertions(+), 177 deletions(-) diff --git a/app/main.py b/app/main.py index 3de0bd3..25e5d0d 100644 --- a/app/main.py +++ b/app/main.py @@ -70,6 +70,19 @@ app = FastAPI( logger.info(f"Starting up now...") +@app.middleware("http") +async def db_connection_middleware(request: Request, call_next): + from .db_engine import db + + db.connect(reuse_if_open=True) + try: + response = await call_next(request) + return response + finally: + if not db.is_closed(): + db.close() + + app.include_router(current.router) app.include_router(players.router) app.include_router(results.router) diff --git a/app/routers_v3/awards.py b/app/routers_v3/awards.py index 575ef42..6802634 100644 --- a/app/routers_v3/awards.py +++ b/app/routers_v3/awards.py @@ -71,7 +71,6 @@ async def get_awards( "count": all_awards.count(), "awards": [model_to_dict(x, recurse=not short_output) for x in all_awards], } - db.close() return return_awards @@ -80,10 +79,8 @@ async def get_awards( async def get_one_award(award_id: int, short_output: Optional[bool] = False): this_award = Award.get_or_none(Award.id == award_id) if this_award is None: - db.close() raise HTTPException(status_code=404, detail=f"Award ID {award_id} not found") - db.close() return model_to_dict(this_award, recurse=not short_output) @@ -107,7 +104,6 @@ async def patch_award( this_award = Award.get_or_none(Award.id == award_id) if this_award is None: - db.close() raise HTTPException(status_code=404, detail=f"Award ID {award_id} not found") if name is not None: @@ -129,10 +125,8 @@ async def patch_award( if this_award.save() == 1: r_award = model_to_dict(this_award) - db.close() return r_award else: - db.close() raise HTTPException(status_code=500, detail=f"Unable to patch award {award_id}") @@ -176,7 +170,6 @@ async def post_award(award_list: AwardList, token: str = Depends(oauth2_scheme)) with db.atomic(): for batch in chunked(new_awards, 15): Award.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_awards)} awards" @@ -190,11 +183,9 @@ async def delete_award(award_id: int, token: str = Depends(oauth2_scheme)): this_award = Award.get_or_none(Award.id == award_id) if this_award is None: - db.close() raise HTTPException(status_code=404, detail=f"Award ID {award_id} not found") count = this_award.delete_instance() - db.close() if count == 1: return f"Award {award_id} has been deleted" diff --git a/app/routers_v3/battingstats.py b/app/routers_v3/battingstats.py index 49d3fa8..757e5be 100644 --- a/app/routers_v3/battingstats.py +++ b/app/routers_v3/battingstats.py @@ -91,17 +91,14 @@ async def get_batstats( if "post" in s_type.lower(): all_stats = BattingStat.post_season(season) if all_stats.count() == 0: - db.close() return {"count": 0, "stats": []} elif s_type.lower() in ["combined", "total", "all"]: all_stats = BattingStat.combined_season(season) if all_stats.count() == 0: - db.close() return {"count": 0, "stats": []} else: all_stats = BattingStat.regular_season(season) if all_stats.count() == 0: - db.close() return {"count": 0, "stats": []} if position is not None: @@ -127,7 +124,6 @@ async def get_batstats( if week_end is not None: end = min(week_end, end) if start > end: - db.close() raise HTTPException( status_code=404, detail=f"Start week {start} is after end week {end} - cannot pull stats", @@ -146,7 +142,6 @@ async def get_batstats( # 'stats': [{'id': x.id} for x in all_stats] } - db.close() return return_stats @@ -344,7 +339,6 @@ async def get_totalstats( "bplo": x.sum_bplo, } ) - db.close() return return_stats @@ -368,7 +362,6 @@ async def patch_batstats( BattingStat.update(**new_stats.dict()).where(BattingStat.id == stat_id).execute() r_stat = model_to_dict(BattingStat.get_by_id(stat_id)) - db.close() return r_stat @@ -412,5 +405,4 @@ async def post_batstats(s_list: BatStatList, token: str = Depends(oauth2_scheme) # Update career stats - db.close() return f"Added {len(all_stats)} batting lines" diff --git a/app/routers_v3/current.py b/app/routers_v3/current.py index ba4458f..889c38a 100644 --- a/app/routers_v3/current.py +++ b/app/routers_v3/current.py @@ -41,7 +41,6 @@ async def get_current(season: Optional[int] = None): if current is not None: r_curr = model_to_dict(current) - db.close() return r_curr else: return None @@ -100,10 +99,8 @@ async def patch_current( if current.save(): r_curr = model_to_dict(current) - db.close() return r_curr else: - db.close() raise HTTPException( status_code=500, detail=f"Unable to patch current {current_id}" ) @@ -120,10 +117,8 @@ async def post_current(new_current: CurrentModel, token: str = Depends(oauth2_sc if this_current.save(): r_curr = model_to_dict(this_current) - db.close() return r_curr else: - db.close() raise HTTPException( status_code=500, detail=f"Unable to post season {new_current.season} current", diff --git a/app/routers_v3/custom_commands.py b/app/routers_v3/custom_commands.py index 577e78d..bcd0c18 100644 --- a/app/routers_v3/custom_commands.py +++ b/app/routers_v3/custom_commands.py @@ -364,7 +364,6 @@ async def get_custom_commands( logger.error(f"Error getting custom commands: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() # Move this route to after the specific string routes @@ -430,7 +429,6 @@ async def create_custom_command_endpoint( logger.error(f"Error creating custom command: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.put("/{command_id}", include_in_schema=PRIVATE_IN_SCHEMA) @@ -491,7 +489,6 @@ async def update_custom_command_endpoint( logger.error(f"Error updating custom command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.patch("/{command_id}", include_in_schema=PRIVATE_IN_SCHEMA) @@ -576,7 +573,6 @@ async def patch_custom_command( logger.error(f"Error patching custom command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.delete("/{command_id}", include_in_schema=PRIVATE_IN_SCHEMA) @@ -613,7 +609,6 @@ async def delete_custom_command_endpoint( logger.error(f"Error deleting custom command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() # Creator endpoints @@ -684,7 +679,6 @@ async def get_creators( logger.error(f"Error getting creators: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.post("/creators", include_in_schema=PRIVATE_IN_SCHEMA) @@ -729,7 +723,6 @@ async def create_creator_endpoint( logger.error(f"Error creating creator: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.get("/stats") @@ -855,7 +848,6 @@ async def get_custom_command_stats(): logger.error(f"Error getting custom command stats: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() # Special endpoints for Discord bot integration @@ -922,7 +914,6 @@ async def get_custom_command_by_name_endpoint(command_name: str): logger.error(f"Error getting custom command by name '{command_name}': {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.patch("/by_name/{command_name}/execute", include_in_schema=PRIVATE_IN_SCHEMA) @@ -991,7 +982,6 @@ async def execute_custom_command( logger.error(f"Error executing custom command '{command_name}': {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.get("/autocomplete") @@ -1028,7 +1018,6 @@ async def get_command_names_for_autocomplete( logger.error(f"Error getting command names for autocomplete: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.get("/{command_id}") @@ -1078,4 +1067,3 @@ async def get_custom_command(command_id: int): logger.error(f"Error getting custom command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() diff --git a/app/routers_v3/decisions.py b/app/routers_v3/decisions.py index a59b16f..60e60aa 100644 --- a/app/routers_v3/decisions.py +++ b/app/routers_v3/decisions.py @@ -144,7 +144,6 @@ async def get_decisions( "count": all_dec.count(), "decisions": [model_to_dict(x, recurse=not short_output) for x in all_dec], } - db.close() return return_dec @@ -169,7 +168,6 @@ async def patch_decision( this_dec = Decision.get_or_none(Decision.id == decision_id) if this_dec is None: - db.close() raise HTTPException( status_code=404, detail=f"Decision ID {decision_id} not found" ) @@ -195,10 +193,8 @@ async def patch_decision( if this_dec.save() == 1: d_result = model_to_dict(this_dec) - db.close() return d_result else: - db.close() raise HTTPException( status_code=500, detail=f"Unable to patch decision {decision_id}" ) @@ -227,7 +223,6 @@ async def post_decisions(dec_list: DecisionList, token: str = Depends(oauth2_sch with db.atomic(): for batch in chunked(new_dec, 10): Decision.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_dec)} decisions" @@ -241,13 +236,11 @@ async def delete_decision(decision_id: int, token: str = Depends(oauth2_scheme)) this_dec = Decision.get_or_none(Decision.id == decision_id) if this_dec is None: - db.close() raise HTTPException( status_code=404, detail=f"Decision ID {decision_id} not found" ) count = this_dec.delete_instance() - db.close() if count == 1: return f"Decision {decision_id} has been deleted" @@ -266,11 +259,9 @@ async def delete_decisions_game(game_id: int, token: str = Depends(oauth2_scheme this_game = StratGame.get_or_none(StratGame.id == game_id) if not this_game: - db.close() raise HTTPException(status_code=404, detail=f"Game ID {game_id} not found") count = Decision.delete().where(Decision.game == this_game).execute() - db.close() if count > 0: return f"Deleted {count} decisions matching Game ID {game_id}" diff --git a/app/routers_v3/divisions.py b/app/routers_v3/divisions.py index 095662a..9590fa3 100644 --- a/app/routers_v3/divisions.py +++ b/app/routers_v3/divisions.py @@ -48,7 +48,6 @@ async def get_divisions( "count": all_divisions.count(), "divisions": [model_to_dict(x) for x in all_divisions], } - db.close() return return_div @@ -57,13 +56,11 @@ async def get_divisions( async def get_one_division(division_id: int): this_div = Division.get_or_none(Division.id == division_id) if this_div is None: - db.close() raise HTTPException( status_code=404, detail=f"Division ID {division_id} not found" ) r_div = model_to_dict(this_div) - db.close() return r_div @@ -83,7 +80,6 @@ async def patch_division( this_div = Division.get_or_none(Division.id == division_id) if this_div is None: - db.close() raise HTTPException( status_code=404, detail=f"Division ID {division_id} not found" ) @@ -99,10 +95,8 @@ async def patch_division( if this_div.save() == 1: r_division = model_to_dict(this_div) - db.close() return r_division else: - db.close() raise HTTPException( status_code=500, detail=f"Unable to patch division {division_id}" ) @@ -121,10 +115,8 @@ async def post_division( if this_division.save() == 1: r_division = model_to_dict(this_division) - db.close() return r_division else: - db.close() raise HTTPException(status_code=500, detail=f"Unable to post division") @@ -137,13 +129,11 @@ async def delete_division(division_id: int, token: str = Depends(oauth2_scheme)) this_div = Division.get_or_none(Division.id == division_id) if this_div is None: - db.close() raise HTTPException( status_code=404, detail=f"Division ID {division_id} not found" ) count = this_div.delete_instance() - db.close() if count == 1: return f"Division {division_id} has been deleted" diff --git a/app/routers_v3/draftdata.py b/app/routers_v3/draftdata.py index 1329fb9..f7478c6 100644 --- a/app/routers_v3/draftdata.py +++ b/app/routers_v3/draftdata.py @@ -32,7 +32,6 @@ async def get_draftdata(): if draft_data is not None: r_data = model_to_dict(draft_data) - db.close() return r_data raise HTTPException(status_code=404, detail=f'No draft data found') @@ -50,7 +49,6 @@ async def patch_draftdata( draft_data = DraftData.get_or_none(DraftData.id == data_id) if draft_data is None: - db.close() raise HTTPException(status_code=404, detail=f'No draft data found') if currentpick is not None: @@ -68,7 +66,6 @@ async def patch_draftdata( saved = draft_data.save() r_data = model_to_dict(draft_data) - db.close() if saved == 1: return r_data diff --git a/app/routers_v3/draftlist.py b/app/routers_v3/draftlist.py index 4de0d7c..fd6efa7 100644 --- a/app/routers_v3/draftlist.py +++ b/app/routers_v3/draftlist.py @@ -48,7 +48,6 @@ async def get_draftlist( r_list = {"count": all_list.count(), "picks": [model_to_dict(x) for x in all_list]} - db.close() return r_list @@ -69,7 +68,6 @@ async def get_team_draftlist(team_id: int, token: str = Depends(oauth2_scheme)): "picks": [model_to_dict(x) for x in this_list], } - db.close() return r_list @@ -99,7 +97,6 @@ async def post_draftlist( for batch in chunked(new_list, 15): DraftList.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_list)} list values" @@ -111,5 +108,4 @@ async def delete_draftlist(team_id: int, token: str = Depends(oauth2_scheme)): raise HTTPException(status_code=401, detail="Unauthorized") count = DraftList.delete().where(DraftList.team_id == team_id).execute() - db.close() return f"Deleted {count} list values" diff --git a/app/routers_v3/draftpicks.py b/app/routers_v3/draftpicks.py index 2214aa3..9e3c1da 100644 --- a/app/routers_v3/draftpicks.py +++ b/app/routers_v3/draftpicks.py @@ -123,7 +123,6 @@ async def get_picks( for line in all_picks: return_picks["picks"].append(model_to_dict(line, recurse=not short_output)) - db.close() return return_picks @@ -135,7 +134,6 @@ async def get_one_pick(pick_id: int, short_output: Optional[bool] = False): r_pick = model_to_dict(this_pick, recurse=not short_output) else: raise HTTPException(status_code=404, detail=f"Pick ID {pick_id} not found") - db.close() return r_pick @@ -153,7 +151,6 @@ async def patch_pick( DraftPick.update(**new_pick.dict()).where(DraftPick.id == pick_id).execute() r_pick = model_to_dict(DraftPick.get_by_id(pick_id)) - db.close() return r_pick @@ -170,7 +167,6 @@ async def post_picks(p_list: DraftPickList, token: str = Depends(oauth2_scheme)) DraftPick.season == pick.season, DraftPick.overall == pick.overall ) if dupe: - db.close() raise HTTPException( status_code=500, detail=f"Pick # {pick.overall} already exists for season {pick.season}", @@ -181,7 +177,6 @@ async def post_picks(p_list: DraftPickList, token: str = Depends(oauth2_scheme)) with db.atomic(): for batch in chunked(new_picks, 15): DraftPick.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_picks)} picks" @@ -198,7 +193,6 @@ async def delete_pick(pick_id: int, token: str = Depends(oauth2_scheme)): raise HTTPException(status_code=404, detail=f"Pick ID {pick_id} not found") count = this_pick.delete_instance() - db.close() if count == 1: return f"Draft pick {pick_id} has been deleted" diff --git a/app/routers_v3/fieldingstats.py b/app/routers_v3/fieldingstats.py index ade0239..94a3537 100644 --- a/app/routers_v3/fieldingstats.py +++ b/app/routers_v3/fieldingstats.py @@ -25,17 +25,14 @@ async def get_fieldingstats( if 'post' in s_type.lower(): all_stats = BattingStat.post_season(season) if all_stats.count() == 0: - db.close() return {'count': 0, 'stats': []} elif s_type.lower() in ['combined', 'total', 'all']: all_stats = BattingStat.combined_season(season) if all_stats.count() == 0: - db.close() return {'count': 0, 'stats': []} else: all_stats = BattingStat.regular_season(season) if all_stats.count() == 0: - db.close() return {'count': 0, 'stats': []} all_stats = all_stats.where( @@ -63,7 +60,6 @@ async def get_fieldingstats( if week_end is not None: end = min(week_end, end) if start > end: - db.close() raise HTTPException( status_code=404, detail=f'Start week {start} is after end week {end} - cannot pull stats' @@ -96,7 +92,6 @@ async def get_fieldingstats( } for x in all_stats] } - db.close() return return_stats @@ -219,5 +214,4 @@ async def get_totalstats( }) return_stats['count'] = len(return_stats['stats']) - db.close() return return_stats diff --git a/app/routers_v3/help_commands.py b/app/routers_v3/help_commands.py index 6d757c7..f056971 100644 --- a/app/routers_v3/help_commands.py +++ b/app/routers_v3/help_commands.py @@ -139,7 +139,6 @@ async def get_help_commands( logger.error(f"Error getting help commands: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.post("/", include_in_schema=PRIVATE_IN_SCHEMA) @@ -188,7 +187,6 @@ async def create_help_command_endpoint( logger.error(f"Error creating help command: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.put("/{command_id}", include_in_schema=PRIVATE_IN_SCHEMA) @@ -239,7 +237,6 @@ async def update_help_command_endpoint( logger.error(f"Error updating help command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.patch("/{command_id}/restore", include_in_schema=PRIVATE_IN_SCHEMA) @@ -278,7 +275,6 @@ async def restore_help_command_endpoint( logger.error(f"Error restoring help command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.delete("/{command_id}", include_in_schema=PRIVATE_IN_SCHEMA) @@ -310,7 +306,6 @@ async def delete_help_command_endpoint( logger.error(f"Error deleting help command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.get("/stats") @@ -369,7 +364,6 @@ async def get_help_command_stats(): logger.error(f"Error getting help command stats: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() # Special endpoints for Discord bot integration @@ -403,7 +397,6 @@ async def get_help_command_by_name_endpoint( logger.error(f"Error getting help command by name '{command_name}': {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.patch("/by_name/{command_name}/view", include_in_schema=PRIVATE_IN_SCHEMA) @@ -440,7 +433,6 @@ async def increment_view_count(command_name: str, token: str = Depends(oauth2_sc logger.error(f"Error incrementing view count for '{command_name}': {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.get("/autocomplete") @@ -471,7 +463,6 @@ async def get_help_names_for_autocomplete( logger.error(f"Error getting help names for autocomplete: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() @router.get("/{command_id}") @@ -500,4 +491,3 @@ async def get_help_command(command_id: int): logger.error(f"Error getting help command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) finally: - db.close() diff --git a/app/routers_v3/injuries.py b/app/routers_v3/injuries.py index 77984eb..2414c27 100644 --- a/app/routers_v3/injuries.py +++ b/app/routers_v3/injuries.py @@ -68,7 +68,6 @@ async def get_injuries( "count": all_injuries.count(), "injuries": [model_to_dict(x, recurse=not short_output) for x in all_injuries], } - db.close() return return_injuries @@ -85,7 +84,6 @@ async def patch_injury( this_injury = Injury.get_or_none(Injury.id == injury_id) if this_injury is None: - db.close() raise HTTPException(status_code=404, detail=f"Injury ID {injury_id} not found") if is_active is not None: @@ -93,10 +91,8 @@ async def patch_injury( if this_injury.save() == 1: r_injury = model_to_dict(this_injury) - db.close() return r_injury else: - db.close() raise HTTPException( status_code=500, detail=f"Unable to patch injury {injury_id}" ) @@ -113,10 +109,8 @@ async def post_injury(new_injury: InjuryModel, token: str = Depends(oauth2_schem if this_injury.save(): r_injury = model_to_dict(this_injury) - db.close() return r_injury else: - db.close() raise HTTPException(status_code=500, detail=f"Unable to post injury") @@ -129,11 +123,9 @@ async def delete_injury(injury_id: int, token: str = Depends(oauth2_scheme)): this_injury = Injury.get_or_none(Injury.id == injury_id) if this_injury is None: - db.close() raise HTTPException(status_code=404, detail=f"Injury ID {injury_id} not found") count = this_injury.delete_instance() - db.close() if count == 1: return f"Injury {injury_id} has been deleted" diff --git a/app/routers_v3/keepers.py b/app/routers_v3/keepers.py index d0fafcf..0dc99cf 100644 --- a/app/routers_v3/keepers.py +++ b/app/routers_v3/keepers.py @@ -48,7 +48,6 @@ async def get_keepers( "count": all_keepers.count(), "keepers": [model_to_dict(x, recurse=not short_output) for x in all_keepers], } - db.close() return return_keepers @@ -78,10 +77,8 @@ async def patch_keeper( if this_keeper.save(): r_keeper = model_to_dict(this_keeper) - db.close() return r_keeper else: - db.close() raise HTTPException( status_code=500, detail=f"Unable to patch keeper {keeper_id}" ) @@ -101,7 +98,6 @@ async def post_keepers(k_list: KeeperList, token: str = Depends(oauth2_scheme)): with db.atomic(): for batch in chunked(new_keepers, 14): Keeper.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_keepers)} keepers" @@ -118,7 +114,6 @@ async def delete_keeper(keeper_id: int, token: str = Depends(oauth2_scheme)): raise HTTPException(status_code=404, detail=f"Keeper ID {keeper_id} not found") count = this_keeper.delete_instance() - db.close() if count == 1: return f"Keeper ID {keeper_id} has been deleted" diff --git a/app/routers_v3/managers.py b/app/routers_v3/managers.py index 4c0de88..589bb48 100644 --- a/app/routers_v3/managers.py +++ b/app/routers_v3/managers.py @@ -76,7 +76,6 @@ async def get_managers( ], } - db.close() return return_managers @@ -86,7 +85,6 @@ async def get_one_manager(manager_id: int, short_output: Optional[bool] = False) this_manager = Manager.get_or_none(Manager.id == manager_id) if this_manager is not None: r_manager = model_to_dict(this_manager, recurse=not short_output) - db.close() return r_manager else: raise HTTPException(status_code=404, detail=f"Manager {manager_id} not found") @@ -108,7 +106,6 @@ async def patch_manager( this_manager = Manager.get_or_none(Manager.id == manager_id) if this_manager is None: - db.close() raise HTTPException( status_code=404, detail=f"Manager ID {manager_id} not found" ) @@ -124,10 +121,8 @@ async def patch_manager( if this_manager.save() == 1: r_manager = model_to_dict(this_manager) - db.close() return r_manager else: - db.close() raise HTTPException( status_code=500, detail=f"Unable to patch manager {this_manager}" ) @@ -144,10 +139,8 @@ async def post_manager(new_manager: ManagerModel, token: str = Depends(oauth2_sc if this_manager.save(): r_manager = model_to_dict(this_manager) - db.close() return r_manager else: - db.close() raise HTTPException( status_code=500, detail=f"Unable to post manager {this_manager.name}" ) @@ -162,13 +155,11 @@ async def delete_manager(manager_id: int, token: str = Depends(oauth2_scheme)): this_manager = Manager.get_or_none(Manager.id == manager_id) if this_manager is None: - db.close() raise HTTPException( status_code=404, detail=f"Manager ID {manager_id} not found" ) count = this_manager.delete_instance() - db.close() if count == 1: return f"Manager {manager_id} has been deleted" diff --git a/app/routers_v3/pitchingstats.py b/app/routers_v3/pitchingstats.py index d318013..982da17 100644 --- a/app/routers_v3/pitchingstats.py +++ b/app/routers_v3/pitchingstats.py @@ -76,17 +76,14 @@ async def get_pitstats( if "post" in s_type.lower(): all_stats = PitchingStat.post_season(season) if all_stats.count() == 0: - db.close() return {"count": 0, "stats": []} elif s_type.lower() in ["combined", "total", "all"]: all_stats = PitchingStat.combined_season(season) if all_stats.count() == 0: - db.close() return {"count": 0, "stats": []} else: all_stats = PitchingStat.regular_season(season) if all_stats.count() == 0: - db.close() return {"count": 0, "stats": []} if team_abbrev is not None: @@ -112,7 +109,6 @@ async def get_pitstats( if week_end is not None: end = min(week_end, end) if start > end: - db.close() raise HTTPException( status_code=404, detail=f"Start week {start} is after end week {end} - cannot pull stats", @@ -132,7 +128,6 @@ async def get_pitstats( "stats": [model_to_dict(x, recurse=not short_output) for x in all_stats], } - db.close() return return_stats @@ -301,7 +296,6 @@ async def get_totalstats( "bsv": x.sum_bsv, } ) - db.close() return return_stats @@ -319,7 +313,6 @@ async def patch_pitstats( PitchingStat.update(**new_stats.dict()).where(PitchingStat.id == stat_id).execute() r_stat = model_to_dict(PitchingStat.get_by_id(stat_id)) - db.close() return r_stat @@ -350,5 +343,4 @@ async def post_pitstats(s_list: PitStatList, token: str = Depends(oauth2_scheme) for batch in chunked(all_stats, 15): PitchingStat.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Added {len(all_stats)} batting lines" diff --git a/app/routers_v3/results.py b/app/routers_v3/results.py index 7ba46b8..c7bfec3 100644 --- a/app/routers_v3/results.py +++ b/app/routers_v3/results.py @@ -78,7 +78,6 @@ async def get_results( "count": all_results.count(), "results": [model_to_dict(x, recurse=not short_output) for x in all_results], } - db.close() return return_results @@ -90,7 +89,6 @@ async def get_one_result(result_id: int, short_output: Optional[bool] = False): r_result = model_to_dict(this_result, recurse=not short_output) else: r_result = None - db.close() return r_result @@ -142,10 +140,8 @@ async def patch_result( if this_result.save() == 1: r_result = model_to_dict(this_result) - db.close() return r_result else: - db.close() raise HTTPException( status_code=500, detail=f"Unable to patch result {result_id}" ) @@ -185,7 +181,6 @@ async def post_results(result_list: ResultList, token: str = Depends(oauth2_sche with db.atomic(): for batch in chunked(new_results, 15): Result.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_results)} results" @@ -199,11 +194,9 @@ async def delete_result(result_id: int, token: str = Depends(oauth2_scheme)): this_result = Result.get_or_none(Result.id == result_id) if not this_result: - db.close() raise HTTPException(status_code=404, detail=f"Result ID {result_id} not found") count = this_result.delete_instance() - db.close() if count == 1: return f"Result {result_id} has been deleted" diff --git a/app/routers_v3/sbaplayers.py b/app/routers_v3/sbaplayers.py index 296e21e..7c2d59f 100644 --- a/app/routers_v3/sbaplayers.py +++ b/app/routers_v3/sbaplayers.py @@ -98,14 +98,12 @@ async def get_players( if csv: return_val = query_to_csv(all_players) - db.close() return Response(content=return_val, media_type="text/csv") return_val = { "count": all_players.count(), "players": [model_to_dict(x) for x in all_players], } - db.close() return return_val @@ -114,13 +112,11 @@ async def get_players( async def get_one_player(player_id: int): this_player = SbaPlayer.get_or_none(SbaPlayer.id == player_id) if this_player is None: - db.close() raise HTTPException( status_code=404, detail=f"SbaPlayer id {player_id} not found" ) r_data = model_to_dict(this_player) - db.close() return r_data @@ -138,7 +134,6 @@ async def patch_player( ): if not valid_token(token): logging.warning(f"Bad Token: {token}") - db.close() raise HTTPException( status_code=401, detail="You are not authorized to patch mlb players. This event has been logged.", @@ -146,7 +141,6 @@ async def patch_player( this_player = SbaPlayer.get_or_none(SbaPlayer.id == player_id) if this_player is None: - db.close() raise HTTPException( status_code=404, detail=f"SbaPlayer id {player_id} not found" ) @@ -166,10 +160,8 @@ async def patch_player( if this_player.save() == 1: return_val = model_to_dict(this_player) - db.close() return return_val else: - db.close() raise HTTPException( status_code=418, detail="Well slap my ass and call me a teapot; I could not save that player", @@ -181,7 +173,6 @@ async def patch_player( async def post_players(players: PlayerList, token: str = Depends(oauth2_scheme)): if not valid_token(token): logging.warning(f"Bad Token: {token}") - db.close() raise HTTPException( status_code=401, detail="You are not authorized to post mlb players. This event has been logged.", @@ -200,7 +191,6 @@ async def post_players(players: PlayerList, token: str = Depends(oauth2_scheme)) ) if dupes.count() > 0: logger.error(f"Found a dupe for {x}") - db.close() raise HTTPException( status_code=400, detail=f"{x.first_name} {x.last_name} has a key already in the database", @@ -211,7 +201,6 @@ async def post_players(players: PlayerList, token: str = Depends(oauth2_scheme)) with db.atomic(): for batch in chunked(new_players, 15): SbaPlayer.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_players)} new MLB players" @@ -221,7 +210,6 @@ async def post_players(players: PlayerList, token: str = Depends(oauth2_scheme)) async def post_one_player(player: SbaPlayerModel, token: str = Depends(oauth2_scheme)): if not valid_token(token): logging.warning(f"Bad Token: {token}") - db.close() raise HTTPException( status_code=401, detail="You are not authorized to post mlb players. This event has been logged.", @@ -236,7 +224,6 @@ async def post_one_player(player: SbaPlayerModel, token: str = Depends(oauth2_sc logging.info(f"POST /SbaPlayers/one - dupes found:") for x in dupes: logging.info(f"{x}") - db.close() raise HTTPException( status_code=400, detail=f"{player.first_name} {player.last_name} has a key already in the database", @@ -246,10 +233,8 @@ async def post_one_player(player: SbaPlayerModel, token: str = Depends(oauth2_sc saved = new_player.save() if saved == 1: return_val = model_to_dict(new_player) - db.close() return return_val else: - db.close() raise HTTPException( status_code=418, detail="Well slap my ass and call me a teapot; I could not save that player", @@ -261,7 +246,6 @@ async def post_one_player(player: SbaPlayerModel, token: str = Depends(oauth2_sc async def delete_player(player_id: int, token: str = Depends(oauth2_scheme)): if not valid_token(token): logging.warning(f"Bad Token: {token}") - db.close() raise HTTPException( status_code=401, detail="You are not authorized to delete mlb players. This event has been logged.", @@ -269,13 +253,11 @@ async def delete_player(player_id: int, token: str = Depends(oauth2_scheme)): this_player = SbaPlayer.get_or_none(SbaPlayer.id == player_id) if this_player is None: - db.close() raise HTTPException( status_code=404, detail=f"SbaPlayer id {player_id} not found" ) count = this_player.delete_instance() - db.close() if count == 1: return f"Player {player_id} has been deleted" diff --git a/app/routers_v3/schedules.py b/app/routers_v3/schedules.py index afcaabf..a1e8497 100644 --- a/app/routers_v3/schedules.py +++ b/app/routers_v3/schedules.py @@ -73,7 +73,6 @@ async def get_schedules( "count": all_sched.count(), "schedules": [model_to_dict(x, recurse=not short_output) for x in all_sched], } - db.close() return return_sched @@ -85,7 +84,6 @@ async def get_one_schedule(schedule_id: int): r_sched = model_to_dict(this_sched) else: r_sched = None - db.close() return r_sched @@ -127,10 +125,8 @@ async def patch_schedule( if this_sched.save() == 1: r_sched = model_to_dict(this_sched) - db.close() return r_sched else: - db.close() raise HTTPException( status_code=500, detail=f"Unable to patch schedule {schedule_id}" ) @@ -170,7 +166,6 @@ async def post_schedules(sched_list: ScheduleList, token: str = Depends(oauth2_s with db.atomic(): for batch in chunked(new_sched, 15): Schedule.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_sched)} schedules" @@ -189,7 +184,6 @@ async def delete_schedule(schedule_id: int, token: str = Depends(oauth2_scheme)) ) count = this_sched.delete_instance() - db.close() if count == 1: return f"Schedule {this_sched} has been deleted" diff --git a/app/routers_v3/standings.py b/app/routers_v3/standings.py index f5ef37e..857f89e 100644 --- a/app/routers_v3/standings.py +++ b/app/routers_v3/standings.py @@ -62,7 +62,6 @@ async def get_standings( "standings": [model_to_dict(x, recurse=not short_output) for x in div_teams], } - db.close() return return_standings @@ -93,7 +92,6 @@ async def patch_standings( try: this_stan = Standings.get_by_id(stan_id) except Exception as e: - db.close() raise HTTPException(status_code=404, detail=f"No team found with id {stan_id}") if wins: @@ -102,7 +100,6 @@ async def patch_standings( this_stan.losses = losses this_stan.save() - db.close() return model_to_dict(this_stan) @@ -122,7 +119,6 @@ async def post_standings(season: int, token: str = Depends(oauth2_scheme)): with db.atomic(): for batch in chunked(new_teams, 16): Standings.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_teams)} standings" @@ -135,7 +131,6 @@ async def recalculate_standings(season: int, token: str = Depends(oauth2_scheme) raise HTTPException(status_code=401, detail="Unauthorized") code = Standings.recalculate(season) - db.close() if code == 69: raise HTTPException(status_code=500, detail=f"Error recreating Standings rows") return f"Just recalculated standings for season {season}" diff --git a/app/routers_v3/stratgame.py b/app/routers_v3/stratgame.py index ba750a8..ae952fd 100644 --- a/app/routers_v3/stratgame.py +++ b/app/routers_v3/stratgame.py @@ -123,7 +123,6 @@ async def get_games( "count": all_games.count(), "games": [model_to_dict(x, recurse=not short_output) for x in all_games], } - db.close() return return_games @@ -132,11 +131,9 @@ async def get_games( async def get_one_game(game_id: int) -> Any: this_game = StratGame.get_or_none(StratGame.id == game_id) if not this_game: - db.close() raise HTTPException(status_code=404, detail=f"StratGame ID {game_id} not found") g_result = model_to_dict(this_game) - db.close() return g_result @@ -158,7 +155,6 @@ async def patch_game( this_game = StratGame.get_or_none(StratGame.id == game_id) if not this_game: - db.close() raise HTTPException(status_code=404, detail=f"StratGame ID {game_id} not found") if game_num is not None: @@ -253,7 +249,6 @@ async def post_games(game_list: GameList, token: str = Depends(oauth2_scheme)) - with db.atomic(): for batch in chunked(new_games, 16): StratGame.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_games)} games" @@ -267,7 +262,6 @@ async def wipe_game(game_id: int, token: str = Depends(oauth2_scheme)) -> Any: this_game = StratGame.get_or_none(StratGame.id == game_id) if not this_game: - db.close() raise HTTPException(status_code=404, detail=f"StratGame ID {game_id} not found") this_game.away_score = None @@ -278,10 +272,8 @@ async def wipe_game(game_id: int, token: str = Depends(oauth2_scheme)) -> Any: if this_game.save() == 1: g_result = model_to_dict(this_game) - db.close() return g_result else: - db.close() raise HTTPException(status_code=500, detail=f"Unable to wipe game {game_id}") @@ -294,11 +286,9 @@ async def delete_game(game_id: int, token: str = Depends(oauth2_scheme)) -> Any: this_game = StratGame.get_or_none(StratGame.id == game_id) if not this_game: - db.close() raise HTTPException(status_code=404, detail=f"StratGame ID {game_id} not found") count = this_game.delete_instance() - db.close() if count == 1: return f"StratGame {game_id} has been deleted" diff --git a/app/routers_v3/stratplay/batting.py b/app/routers_v3/stratplay/batting.py index 7151aae..2c74356 100644 --- a/app/routers_v3/stratplay/batting.py +++ b/app/routers_v3/stratplay/batting.py @@ -594,5 +594,4 @@ async def get_batting_totals( } ) - db.close() return return_stats diff --git a/app/routers_v3/stratplay/crud.py b/app/routers_v3/stratplay/crud.py index ee56f51..dde61f7 100644 --- a/app/routers_v3/stratplay/crud.py +++ b/app/routers_v3/stratplay/crud.py @@ -20,10 +20,8 @@ logger = logging.getLogger("discord_app") @handle_db_errors async def get_one_play(play_id: int): if StratPlay.get_or_none(StratPlay.id == play_id) is None: - db.close() raise HTTPException(status_code=404, detail=f"Play ID {play_id} not found") r_play = model_to_dict(StratPlay.get_by_id(play_id)) - db.close() return r_play @@ -37,12 +35,10 @@ async def patch_play( raise HTTPException(status_code=401, detail="Unauthorized") if StratPlay.get_or_none(StratPlay.id == play_id) is None: - db.close() raise HTTPException(status_code=404, detail=f"Play ID {play_id} not found") StratPlay.update(**new_play.dict()).where(StratPlay.id == play_id).execute() r_play = model_to_dict(StratPlay.get_by_id(play_id)) - db.close() return r_play @@ -93,7 +89,6 @@ async def post_plays(p_list: PlayList, token: str = Depends(oauth2_scheme)): with db.atomic(): for batch in chunked(new_plays, 20): StratPlay.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"Inserted {len(new_plays)} plays" @@ -107,11 +102,9 @@ async def delete_play(play_id: int, token: str = Depends(oauth2_scheme)): this_play = StratPlay.get_or_none(StratPlay.id == play_id) if not this_play: - db.close() raise HTTPException(status_code=404, detail=f"Play ID {play_id} not found") count = this_play.delete_instance() - db.close() if count == 1: return f"Play {play_id} has been deleted" @@ -130,11 +123,9 @@ async def delete_plays_game(game_id: int, token: str = Depends(oauth2_scheme)): this_game = StratGame.get_or_none(StratGame.id == game_id) if not this_game: - db.close() raise HTTPException(status_code=404, detail=f"Game ID {game_id} not found") count = StratPlay.delete().where(StratPlay.game == this_game).execute() - db.close() if count > 0: return f"Deleted {count} plays matching Game ID {game_id}" @@ -155,5 +146,4 @@ async def post_erun_check(token: str = Depends(oauth2_scheme)): (StratPlay.e_run == 1) & (StratPlay.run == 0) ) count = all_plays.execute() - db.close() return count diff --git a/app/routers_v3/stratplay/fielding.py b/app/routers_v3/stratplay/fielding.py index 3eed444..68e09c4 100644 --- a/app/routers_v3/stratplay/fielding.py +++ b/app/routers_v3/stratplay/fielding.py @@ -361,5 +361,4 @@ async def get_fielding_totals( "week": this_week, } ) - db.close() return return_stats diff --git a/app/routers_v3/stratplay/pitching.py b/app/routers_v3/stratplay/pitching.py index 92226cf..cc79685 100644 --- a/app/routers_v3/stratplay/pitching.py +++ b/app/routers_v3/stratplay/pitching.py @@ -348,7 +348,6 @@ async def get_pitching_totals( ) return_stats["count"] = len(return_stats["stats"]) - db.close() if csv: return Response( content=complex_data_to_csv(return_stats["stats"]), media_type="text/csv" diff --git a/app/routers_v3/stratplay/plays.py b/app/routers_v3/stratplay/plays.py index 7cb53ea..dad2fe7 100644 --- a/app/routers_v3/stratplay/plays.py +++ b/app/routers_v3/stratplay/plays.py @@ -210,5 +210,4 @@ async def get_plays( "count": all_plays.count(), "plays": [model_to_dict(x, recurse=not short_output) for x in all_plays], } - db.close() return return_plays diff --git a/app/routers_v3/transactions.py b/app/routers_v3/transactions.py index 1880dcc..d99908a 100644 --- a/app/routers_v3/transactions.py +++ b/app/routers_v3/transactions.py @@ -98,7 +98,6 @@ async def get_transactions( ], } - db.close() return return_trans @@ -116,7 +115,6 @@ async def patch_transactions( these_moves = Transaction.select().where(Transaction.moveid == move_id) if these_moves.count() == 0: - db.close() raise HTTPException(status_code=404, detail=f"Move ID {move_id} not found") if frozen is not None: @@ -128,7 +126,6 @@ async def patch_transactions( x.cancelled = cancelled x.save() - db.close() return f"Updated {these_moves.count()} transactions" @@ -178,7 +175,6 @@ async def post_transactions( for batch in chunked(all_moves, 15): Transaction.insert_many(batch).on_conflict_ignore().execute() - db.close() return f"{len(all_moves)} transactions have been added" @@ -192,7 +188,6 @@ async def delete_transactions(move_id, token: str = Depends(oauth2_scheme)): delete_query = Transaction.delete().where(Transaction.moveid == move_id) count = delete_query.execute() - db.close() if count > 0: return f"Removed {count} transactions" else: -- 2.25.1 From ac2c5920cecab626d4bc84d36aa345ddfebca7b0 Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Fri, 27 Mar 2026 06:34:37 -0500 Subject: [PATCH 2/3] fix: remove empty finally clauses in custom_commands and help_commands After removing db.close() calls, 22 finally: blocks were left empty (12 in custom_commands.py, 10 in help_commands.py), causing IndentationError at import time. Removed the finally: clause entirely since connection lifecycle is now handled by the middleware. Co-Authored-By: Claude Sonnet 4.6 --- app/routers_v3/custom_commands.py | 12 ------------ app/routers_v3/help_commands.py | 10 ---------- 2 files changed, 22 deletions(-) diff --git a/app/routers_v3/custom_commands.py b/app/routers_v3/custom_commands.py index bcd0c18..56bc53b 100644 --- a/app/routers_v3/custom_commands.py +++ b/app/routers_v3/custom_commands.py @@ -363,7 +363,6 @@ async def get_custom_commands( except Exception as e: logger.error(f"Error getting custom commands: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: # Move this route to after the specific string routes @@ -428,7 +427,6 @@ async def create_custom_command_endpoint( except Exception as e: logger.error(f"Error creating custom command: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.put("/{command_id}", include_in_schema=PRIVATE_IN_SCHEMA) @@ -488,7 +486,6 @@ async def update_custom_command_endpoint( except Exception as e: logger.error(f"Error updating custom command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.patch("/{command_id}", include_in_schema=PRIVATE_IN_SCHEMA) @@ -572,7 +569,6 @@ async def patch_custom_command( except Exception as e: logger.error(f"Error patching custom command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.delete("/{command_id}", include_in_schema=PRIVATE_IN_SCHEMA) @@ -608,7 +604,6 @@ async def delete_custom_command_endpoint( except Exception as e: logger.error(f"Error deleting custom command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: # Creator endpoints @@ -678,7 +673,6 @@ async def get_creators( except Exception as e: logger.error(f"Error getting creators: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.post("/creators", include_in_schema=PRIVATE_IN_SCHEMA) @@ -722,7 +716,6 @@ async def create_creator_endpoint( except Exception as e: logger.error(f"Error creating creator: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.get("/stats") @@ -847,7 +840,6 @@ async def get_custom_command_stats(): except Exception as e: logger.error(f"Error getting custom command stats: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: # Special endpoints for Discord bot integration @@ -913,7 +905,6 @@ async def get_custom_command_by_name_endpoint(command_name: str): except Exception as e: logger.error(f"Error getting custom command by name '{command_name}': {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.patch("/by_name/{command_name}/execute", include_in_schema=PRIVATE_IN_SCHEMA) @@ -981,7 +972,6 @@ async def execute_custom_command( except Exception as e: logger.error(f"Error executing custom command '{command_name}': {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.get("/autocomplete") @@ -1017,7 +1007,6 @@ async def get_command_names_for_autocomplete( except Exception as e: logger.error(f"Error getting command names for autocomplete: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.get("/{command_id}") @@ -1066,4 +1055,3 @@ async def get_custom_command(command_id: int): except Exception as e: logger.error(f"Error getting custom command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: diff --git a/app/routers_v3/help_commands.py b/app/routers_v3/help_commands.py index f056971..5b6df18 100644 --- a/app/routers_v3/help_commands.py +++ b/app/routers_v3/help_commands.py @@ -138,7 +138,6 @@ async def get_help_commands( except Exception as e: logger.error(f"Error getting help commands: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.post("/", include_in_schema=PRIVATE_IN_SCHEMA) @@ -186,7 +185,6 @@ async def create_help_command_endpoint( except Exception as e: logger.error(f"Error creating help command: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.put("/{command_id}", include_in_schema=PRIVATE_IN_SCHEMA) @@ -236,7 +234,6 @@ async def update_help_command_endpoint( except Exception as e: logger.error(f"Error updating help command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.patch("/{command_id}/restore", include_in_schema=PRIVATE_IN_SCHEMA) @@ -274,7 +271,6 @@ async def restore_help_command_endpoint( except Exception as e: logger.error(f"Error restoring help command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.delete("/{command_id}", include_in_schema=PRIVATE_IN_SCHEMA) @@ -305,7 +301,6 @@ async def delete_help_command_endpoint( except Exception as e: logger.error(f"Error deleting help command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.get("/stats") @@ -363,7 +358,6 @@ async def get_help_command_stats(): except Exception as e: logger.error(f"Error getting help command stats: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: # Special endpoints for Discord bot integration @@ -396,7 +390,6 @@ async def get_help_command_by_name_endpoint( except Exception as e: logger.error(f"Error getting help command by name '{command_name}': {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.patch("/by_name/{command_name}/view", include_in_schema=PRIVATE_IN_SCHEMA) @@ -432,7 +425,6 @@ async def increment_view_count(command_name: str, token: str = Depends(oauth2_sc except Exception as e: logger.error(f"Error incrementing view count for '{command_name}': {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.get("/autocomplete") @@ -462,7 +454,6 @@ async def get_help_names_for_autocomplete( except Exception as e: logger.error(f"Error getting help names for autocomplete: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: @router.get("/{command_id}") @@ -490,4 +481,3 @@ async def get_help_command(command_id: int): except Exception as e: logger.error(f"Error getting help command {command_id}: {e}") raise HTTPException(status_code=500, detail=str(e)) - finally: -- 2.25.1