Bind dashboard ingestion to current stream

This commit is contained in:
2026-05-12 12:30:34 -05:00
parent 76c4f45607
commit e3b0fc5be8

View File

@@ -29,7 +29,7 @@ app = FastAPI(
class DashboardRequest(BaseModel): class DashboardRequest(BaseModel):
"""Request body for saving a stream dashboard.""" """Request body for saving a stream dashboard."""
session_id: str session_id: str | None = None
raw_markdown: str raw_markdown: str
stream_title: str | None = None stream_title: str | None = None
game: str | None = None game: str | None = None
@@ -311,17 +311,30 @@ def dashboard_status(dashboard: dict | None) -> dict:
} }
@app.post("/admin/session/dashboard", dependencies=[Depends(require_admin)]) def get_current_stream_session_id() -> str | None:
async def save_session_dashboard(request: DashboardRequest) -> dict: """Resolve the session currently bound to Twitch or the only active session."""
"""Create or update the approved dashboard for a stream session.""" if not orchestrator:
return None
if twitch_session_id and twitch_session_id in orchestrator.active_sessions:
return twitch_session_id
if len(orchestrator.active_sessions) == 1:
return next(iter(orchestrator.active_sessions))
return None
async def save_dashboard_for_session(
session_id: str,
request: DashboardRequest,
) -> dict:
"""Persist a dashboard and refresh live orchestrator context."""
async for db_session in get_db_session(): async for db_session in get_db_session():
repo = Repository(db_session) repo = Repository(db_session)
stream_session = await repo.get_session(request.session_id) stream_session = await repo.get_session(session_id)
if not stream_session: if not stream_session:
raise HTTPException(status_code=404, detail="Session not found") raise HTTPException(status_code=404, detail="Session not found")
dashboard = await repo.upsert_dashboard( dashboard = await repo.upsert_dashboard(
session_id=request.session_id, session_id=session_id,
raw_markdown=request.raw_markdown, raw_markdown=request.raw_markdown,
stream_title=request.stream_title, stream_title=request.stream_title,
game=request.game, game=request.game,
@@ -332,17 +345,42 @@ async def save_session_dashboard(request: DashboardRequest) -> dict:
content_angle=request.content_angle, content_angle=request.content_angle,
) )
if orchestrator and request.session_id in orchestrator.active_sessions: dashboard_data = serialize_dashboard(dashboard)
orchestrator.active_sessions[request.session_id]["dashboard"] = ( if orchestrator and session_id in orchestrator.active_sessions:
serialize_dashboard(dashboard) orchestrator.active_sessions[session_id]["dashboard"] = dashboard_data
) orchestrator.active_sessions[session_id]["theme"] = (
orchestrator.active_sessions[request.session_id]["theme"] = (
request.content_angle or request.stream_title request.content_angle or request.stream_title
) )
return dashboard_data
@app.post("/admin/session/dashboard", dependencies=[Depends(require_admin)])
async def save_session_dashboard(request: DashboardRequest) -> dict:
"""Create or update the approved dashboard for a stream session."""
if not request.session_id:
raise HTTPException(status_code=400, detail="session_id is required")
dashboard = await save_dashboard_for_session(request.session_id, request)
return { return {
"status": "dashboard_saved", "status": "dashboard_saved",
"dashboard": serialize_dashboard(dashboard), "dashboard": dashboard,
"timestamp": datetime.utcnow().isoformat(),
}
@app.post("/admin/stream/dashboard", dependencies=[Depends(require_admin)])
async def save_current_stream_dashboard(request: DashboardRequest) -> dict:
"""Create or update the approved dashboard for the current stream session."""
session_id = get_current_stream_session_id()
if not session_id:
raise HTTPException(status_code=404, detail="No active stream session found")
dashboard = await save_dashboard_for_session(session_id, request)
return {
"status": "dashboard_saved",
"session_id": session_id,
"dashboard": dashboard,
"timestamp": datetime.utcnow().isoformat(), "timestamp": datetime.utcnow().isoformat(),
} }
@@ -362,6 +400,26 @@ async def get_session_dashboard(session_id: str) -> dict:
} }
@app.get("/admin/stream/dashboard", dependencies=[Depends(require_admin)])
async def get_current_stream_dashboard() -> dict:
"""Get the approved dashboard for the current stream session."""
session_id = get_current_stream_session_id()
if not session_id:
raise HTTPException(status_code=404, detail="No active stream session found")
async for db_session in get_db_session():
repo = Repository(db_session)
dashboard = await repo.get_dashboard(session_id)
if not dashboard:
raise HTTPException(status_code=404, detail="Dashboard not found")
return {
"session_id": session_id,
"dashboard": serialize_dashboard(dashboard),
"timestamp": datetime.utcnow().isoformat(),
}
@app.get("/admin/ledger", dependencies=[Depends(require_admin)]) @app.get("/admin/ledger", dependencies=[Depends(require_admin)])
async def get_ledger(session_id: str) -> dict: async def get_ledger(session_id: str) -> dict:
"""Get the markdown ledger for a session.""" """Get the markdown ledger for a session."""