Реал-тайм через SSE (push-to-invalidate): живые приглашения/партии, авто-обновление без перезагрузки
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
"""Публикация SSE-событий «данные изменились» нужным пользователям.
|
||||
|
||||
Тонкая прослойка над core.events.hub — держит роутеры чистыми. Событие несёт лишь тип и id,
|
||||
клиент по нему точечно перезапрашивает данные.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from sqlmodel import Session, select
|
||||
|
||||
from app.core.events import hub
|
||||
from app.models import GroupMember, Match
|
||||
|
||||
|
||||
def _group_member_ids(session: Session, group_id: int) -> list[int]:
|
||||
return list(
|
||||
session.exec(select(GroupMember.user_id).where(GroupMember.group_id == group_id)).all()
|
||||
)
|
||||
|
||||
|
||||
def match_changed(session: Session, match: Match) -> None:
|
||||
"""Партия изменилась — уведомить всех участников её группы."""
|
||||
hub.publish(
|
||||
_group_member_ids(session, match.group_id),
|
||||
{"type": "match", "match_id": match.id, "group_id": match.group_id},
|
||||
)
|
||||
|
||||
|
||||
def match_removed(session: Session, match_id: int, group_id: int) -> None:
|
||||
"""Партия удалена — уведомить участников группы (обновить списки)."""
|
||||
hub.publish(
|
||||
_group_member_ids(session, group_id),
|
||||
{"type": "match", "match_id": match_id, "group_id": group_id},
|
||||
)
|
||||
|
||||
|
||||
def group_changed(session: Session, group_id: int, extra_user_ids: list[int] | None = None) -> None:
|
||||
"""Состав/данные группы изменились — участникам (+ доп. адресатам, напр. удалённому)."""
|
||||
ids = _group_member_ids(session, group_id)
|
||||
if extra_user_ids:
|
||||
ids = ids + extra_user_ids
|
||||
hub.publish(ids, {"type": "group", "group_id": group_id})
|
||||
|
||||
|
||||
def invitations_changed(user_id: int) -> None:
|
||||
"""У пользователя изменился список приглашений."""
|
||||
hub.publish([user_id], {"type": "invitations"})
|
||||
Reference in New Issue
Block a user