Include morning routine in session_update WebSocket broadcast

_broadcast_session was missing morning_routine in its payload, so the
TV dashboard's applySnapshot reset the list to [] whenever a session
started or updated via WebSocket. A page refresh was required to
restore the items since only the REST dashboard endpoint included them.

Now queries MorningRoutineItem via child→user_id and adds the list to
every session_update broadcast, matching the dashboard snapshot.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-01 22:38:46 -08:00
parent 115fe12886
commit ca858c2050

View File

@@ -7,6 +7,7 @@ from sqlalchemy.orm import selectinload
from app.dependencies import get_db, get_current_user from app.dependencies import get_db, get_current_user
from app.models.child import Child from app.models.child import Child
from app.models.morning_routine import MorningRoutineItem
from app.models.schedule import ScheduleBlock, ScheduleTemplate from app.models.schedule import ScheduleBlock, ScheduleTemplate
from app.models.subject import Subject # noqa: F401 — needed for selectinload chain from app.models.subject import Subject # noqa: F401 — needed for selectinload chain
from app.models.session import DailySession, TimerEvent from app.models.session import DailySession, TimerEvent
@@ -68,6 +69,18 @@ async def _broadcast_session(db: AsyncSession, session: DailySession) -> None:
) )
completed_ids = [e.block_id for e in events_result.scalars().all() if e.block_id] completed_ids = [e.block_id for e in events_result.scalars().all() if e.block_id]
# Fetch morning routine items via child → user_id
child_result = await db.execute(select(Child).where(Child.id == session.child_id))
child = child_result.scalar_one_or_none()
morning_routine: list[str] = []
if child:
routine_result = await db.execute(
select(MorningRoutineItem)
.where(MorningRoutineItem.user_id == child.user_id)
.order_by(MorningRoutineItem.order_index, MorningRoutineItem.id)
)
morning_routine = [item.text for item in routine_result.scalars().all()]
payload = { payload = {
"event": "session_update", "event": "session_update",
"session": { "session": {
@@ -81,6 +94,7 @@ async def _broadcast_session(db: AsyncSession, session: DailySession) -> None:
"completed_block_ids": completed_ids, "completed_block_ids": completed_ids,
"day_start_time": day_start_time, "day_start_time": day_start_time,
"day_end_time": day_end_time, "day_end_time": day_end_time,
"morning_routine": morning_routine,
} }
await manager.broadcast(session.child_id, payload) await manager.broadcast(session.child_id, payload)