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:
@@ -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"})
|
||||
|
||||
Reference in New Issue
Block a user