feat(room): роль организатора в метаданных LiveKit-токена

Предварительная работа для очереди рук и принудительного мьюта (B1/B2):
build_join кладёт is_organizer:true в метаданные токена организатора
(создатель мгновенной конференции и владелец при обычном входе). Метаданные
токена — только подсказка для UI (см. предупреждение в докстринге
build_join), любое серверное действие организатора обязано перепроверяться
по conference.owner_id в БД — так и сделано в mute_participant (B2).

На фронте — общий парсер метаданных участника (lib/participantMetadata.ts,
переиспользован в RoomParticipantTile вместо локальной копии) и хук
useIsOrganizer (читает подсказку для локального участника через
useLocalParticipant — вызывается только внутри LiveKitRoom).
This commit is contained in:
2026-08-01 22:06:10 +03:00
parent 07dc1aaeef
commit 42bfb88a22
5 changed files with 90 additions and 5 deletions

View File

@@ -154,6 +154,7 @@ class ConferenceService:
name=owner_name,
chat_enabled=chat_enabled,
avatar_url=resolve_avatar_url(self._media_root, owner_avatar_path),
is_organizer=True,
)
else:
# Плановая (разовая) либо закреплённая с повторением/датой — есть
@@ -247,6 +248,7 @@ class ConferenceService:
name=user.name_user,
chat_enabled=chat_enabled,
avatar_url=resolve_avatar_url(self._media_root, user.avatar_path),
is_organizer=conference.owner_id is not None and conference.owner_id == user.id,
)
async def join_as_guest(self, conference_id: uuid.UUID, *, data: GuestJoinIn) -> JoinOut: