fix: harden request handling, pipeline containment, and startup boundaries
This commit is contained in:
parent
2cc33a721c
commit
3555256a02
18 changed files with 656 additions and 107 deletions
|
|
@ -8,7 +8,7 @@ import structlog
|
|||
from fastapi import APIRouter, HTTPException, Request
|
||||
from fastapi.responses import StreamingResponse
|
||||
|
||||
from app.adapters.spotify.errors import SpotifyError
|
||||
from app.adapters.spotify.errors import SpotifyAuthenticationError, SpotifyError
|
||||
from app.adapters.spotify.session import SpotifySession
|
||||
from app.api.routes import resolve_session
|
||||
from app.api.schemas import (
|
||||
|
|
@ -69,7 +69,6 @@ async def recommendations(
|
|||
|
||||
return StreamingResponse(
|
||||
_stream_lines(
|
||||
request,
|
||||
pipeline,
|
||||
resolved.session_id,
|
||||
request_id,
|
||||
|
|
@ -101,6 +100,9 @@ async def create_playlist(
|
|||
"Music discovery selected by the listener.",
|
||||
)
|
||||
await writer.add_tracks_to_playlist(playlist.id, payload.track_uris)
|
||||
except SpotifyAuthenticationError as error:
|
||||
structlog.get_logger().warning("playlist_write_failed", error_type=type(error).__name__)
|
||||
raise HTTPException(status_code=401, detail="Spotify authentication expired") from error
|
||||
except (SpotifyError, ValueError) as error:
|
||||
structlog.get_logger().warning("playlist_write_failed", error_type=type(error).__name__)
|
||||
raise HTTPException(status_code=502, detail="Spotify playlist creation failed") from error
|
||||
|
|
@ -108,7 +110,6 @@ async def create_playlist(
|
|||
|
||||
|
||||
async def _stream_lines(
|
||||
request: Request,
|
||||
pipeline: RecommendationPipeline,
|
||||
session_id: str,
|
||||
request_id: str,
|
||||
|
|
@ -127,8 +128,6 @@ async def _stream_lines(
|
|||
)
|
||||
try:
|
||||
async for event in event_stream:
|
||||
if await request.is_disconnected():
|
||||
return
|
||||
yield f"{_to_wire_event(event).model_dump_json()}\n"
|
||||
except asyncio.CancelledError:
|
||||
raise
|
||||
|
|
@ -137,12 +136,11 @@ async def _stream_lines(
|
|||
"recommendation_stream_failed",
|
||||
error_type=type(error).__name__,
|
||||
)
|
||||
if not await request.is_disconnected():
|
||||
failure = ErrorEvent(
|
||||
code="recommendation_failed",
|
||||
message="Recommendation could not be completed.",
|
||||
)
|
||||
yield f"{failure.model_dump_json()}\n"
|
||||
failure = ErrorEvent(
|
||||
code="recommendation_failed",
|
||||
message="Recommendation could not be completed.",
|
||||
)
|
||||
yield f"{failure.model_dump_json()}\n"
|
||||
finally:
|
||||
await event_stream.aclose()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue