feat: add proper HTTP status codes to all API error responses

- 217 error returns across 18 route files + api.py now use JSONResponse
  with appropriate HTTP status codes instead of returning HTTP 200
- Status code distribution: 500 (121), 400 (39), 503 (28), 404 (24), 409 (3), 502 (2)
- Fixed language.py tuple-return bug (was serializing as JSON array)
- Fixed bare except clauses in bipolar_mode.py and voice.py
- Body-level error schemas preserved (status/error + success/error patterns)
  so web UI continues working without changes
- chat.py (SSE) unchanged: errors sent within stream protocol
- All 170 tests pass
This commit is contained in:
2026-04-15 15:43:18 +03:00
parent 33b2033cc3
commit edc9f27925
19 changed files with 243 additions and 227 deletions

View File

@@ -1,6 +1,7 @@
"""Mood management routes: DM mood, per-server mood, available moods, test mood."""
from fastapi import APIRouter
from fastapi.responses import JSONResponse
import globals
from server_manager import server_manager
from routes.models import MoodSetRequest
@@ -23,7 +24,7 @@ async def set_mood_endpoint(data: MoodSetRequest):
# This endpoint now operates on DM_MOOD
from utils.moods import MOOD_EMOJIS
if data.mood not in MOOD_EMOJIS:
return {"status": "error", "message": f"Mood '{data.mood}' not recognized. Available moods: {', '.join(MOOD_EMOJIS.keys())}"}
return JSONResponse(status_code=400, content={"status": "error", "message": f"Mood '{data.mood}' not recognized. Available moods: {', '.join(MOOD_EMOJIS.keys())}"})
# Update DM mood (DMs don't have nicknames, so no nickname update needed)
globals.DM_MOOD = data.mood
@@ -94,13 +95,13 @@ async def set_server_mood_endpoint(guild_id: int, data: MoodSetRequest):
# Check if server exists
if guild_id not in server_manager.servers:
logger.warning(f"Server {guild_id} not found in server_manager.servers")
return {"status": "error", "message": "Server not found"}
return JSONResponse(status_code=404, content={"status": "error", "message": "Server not found"})
# Check if mood is valid
from utils.moods import MOOD_EMOJIS
if data.mood not in MOOD_EMOJIS:
logger.warning(f"Mood '{data.mood}' not found in MOOD_EMOJIS. Available moods: {list(MOOD_EMOJIS.keys())}")
return {"status": "error", "message": f"Mood '{data.mood}' not recognized. Available moods: {', '.join(MOOD_EMOJIS.keys())}"}
return JSONResponse(status_code=400, content={"status": "error", "message": f"Mood '{data.mood}' not recognized. Available moods: {', '.join(MOOD_EMOJIS.keys())}"})
success = server_manager.set_server_mood(guild_id, data.mood)
logger.debug(f"Server mood set result: {success}")
@@ -113,7 +114,7 @@ async def set_server_mood_endpoint(guild_id: int, data: MoodSetRequest):
return {"status": "ok", "new_mood": data.mood, "guild_id": guild_id}
logger.warning(f"set_server_mood returned False for unknown reason")
return {"status": "error", "message": "Failed to set server mood"}
return JSONResponse(status_code=500, content={"status": "error", "message": "Failed to set server mood"})
@router.post("/servers/{guild_id}/mood/reset")
@@ -124,7 +125,7 @@ async def reset_server_mood_endpoint(guild_id: int):
# Check if server exists
if guild_id not in server_manager.servers:
logger.warning(f"Server {guild_id} not found in server_manager.servers")
return {"status": "error", "message": "Server not found"}
return JSONResponse(status_code=404, content={"status": "error", "message": "Server not found"})
logger.debug(f"Server validation passed, calling set_server_mood")
success = server_manager.set_server_mood(guild_id, "neutral")
@@ -138,7 +139,7 @@ async def reset_server_mood_endpoint(guild_id: int):
return {"status": "ok", "new_mood": "neutral", "guild_id": guild_id}
logger.warning(f"set_server_mood returned False for unknown reason")
return {"status": "error", "message": "Failed to reset server mood"}
return JSONResponse(status_code=500, content={"status": "error", "message": "Failed to reset server mood"})
@router.get("/servers/{guild_id}/mood/state")
@@ -147,7 +148,7 @@ def get_server_mood_state(guild_id: int):
mood_state = server_manager.get_server_mood_state(guild_id)
if mood_state:
return {"status": "ok", "guild_id": guild_id, "mood_state": mood_state}
return {"status": "error", "message": "Server not found"}
return JSONResponse(status_code=404, content={"status": "error", "message": "Server not found"})
# ========== Misc Mood ==========
@@ -166,7 +167,7 @@ async def test_mood_change(guild_id: int, data: MoodSetRequest):
# Check if server exists
if guild_id not in server_manager.servers:
return {"status": "error", "message": f"Server {guild_id} not found"}
return JSONResponse(status_code=404, content={"status": "error", "message": f"Server {guild_id} not found"})
server_config = server_manager.get_server_config(guild_id)
logger.debug(f"TEST: Server config found: {server_config.guild_name if server_config else 'None'}")
@@ -189,4 +190,4 @@ async def test_mood_change(guild_id: int, data: MoodSetRequest):
return {"status": "ok", "message": f"Test mood change completed", "success": success}
return {"status": "error", "message": "Mood change failed"}
return JSONResponse(status_code=500, content={"status": "error", "message": "Mood change failed"})