Перейти к основному содержимому

GET /api/messenger/conferences/{conferenceId} — Карточка конференции

Read-only карточка конференции с текущим ростером: статус, длительность, состав участников, состояние записи. Проекция ConferenceSessionEntity + ростер (call-participant.md). Дом полей — conference-session.md.

Назначение

Отдать участнику Deal-чата актуальное состояние конференции (для панели встречи, экрана истории, обновления состава после потери push). Дескриптор входа Room не выдаётся — токен получают через join-conference.md или conference-media-token.md. Owning-сервис — messenger, feature group conferences.

Metadata

ПолеЗначение
Сервис/контекстmessenger
API areaconferences
Feature groupconferences
Статусdraft
Документdocs/06-services/messenger/api/conferences/get-conference.md

Актор и доступ

ПроверкаЗначение
Actor typeUser — активный участник Deal-чата конференции
Auth policy / Permissionspermission messenger.conferences.use
Scope (RBAC)не применяется — доступ по членству в чате
Record-levelактивный ParticipantEntity чата ChatId конференции (INV-CHAT-4)
Tenant isolationне применяется (кросс-tenant); срез — по членству
Auditread (не sensitive: карточка без токенов/медиа)

HTTP-контракт

ПолеЗначение
MethodGET
Route/api/messenger/conferences/{conferenceId}
Success status200
Idempotency headerне применяется (безопасный GET)
Correlationсквозной trace через traceparent

Входные данные / параметры запроса

ПолеИсточникТипОбязательностьВалидация / ОграниченияБезопасность
ConferenceIdrouteGuidДа!= Empty; существующая конференция, актор — участник Deal-чата
ActorUserIdidentity claimsGuidДаиз JWT; активное членство в ChatId конференции

Модель ответа ConferenceModel

Проекция ConferenceSessionEntity с ростером; полный состав полей карточки и вложенной ConferenceParticipantEntrystart-conference.md. В этой (read-only) проекции Room = null — токен на чтении не выдаётся.

ПолеТипОбязательностьИсточникMaskingОписание
ConferenceIdGuidДаConferenceSessionEntity.IdИдентификатор конференции.
ChatIdGuidДа.ChatIdDeal-чат.
DealIdGuid?Нет.DealIdСделка.
MediaTypeCallMediaTypeДа.MediaTypeAudio/Video.
StatusConferenceStatusДа.StatusProvisioning/Active/Ended/Failed.
Titlestring?Нет.TitleНазвание встречи.
StartedByUserIdGuidДа.StartedByUserIdИнициатор.
StartedAtDateTimeOffsetДа.StartedAtМомент старта.
EndedAtDateTimeOffset?Нет.EndedAtnull для активной.
DurationSecondsint?Нет.DurationSecondsnull до завершения.
RecordingStatusRecordingStatus?НетCallRecordingEntity.StatusСтатус записи, если ведётся/велась.
RecordingIdGuid?НетCallRecordingEntity.IdИдентификатор записи.
ActiveParticipantCountintДа.ActiveParticipantCountАктивных на момент чтения.
ParticipantsConferenceParticipantEntry[]Даростер (call-participant.md)Текущий/итоговый состав (IsActive per-строка).
RoomMediaJoinModel?НетВсегда null на чтении.

Алгоритм

Тривиальное чтение. Операцию выполняет активный участник Deal-чата (User, право messenger.conferences.use); ConferenceId непустой (иначе ошибка валидации). Конференция грузится по ConferenceId (нет → MSG_CONFERENCE_NOT_FOUND) вместе с ростером; актор проверяется на активное членство в её ChatId (INV-CHAT-4), иначе MSG_CHAT_ACCESS_DENIED. В ответ собирается ConferenceModel с Participants (per-строка IsActive = State == Joined, DurationSeconds для вышедших) и Room = null; статус и RecordingStatus — актуальные. HTTP 200. Токен на вход здесь не выдаётся — только через join/media-token.

Ошибки и failure modes

КодHTTP statusУсловиеСообщениеRetry
VALIDATION_FAILED400ConferenceId = Empty«Проверьте параметры запроса»no retry
MSG_CONFERENCE_NOT_FOUND404конференции нет«Конференция не найдена»no retry
MSG_CHAT_ACCESS_DENIED403актор не участник Deal-чата«Нет доступа к конференции»no retry

Acceptance Criteria

  • Активная конференция (happy). Дано: актор — активный участник Deal-чата, конференция Active. Когда запрашивает карточку. Тогда 200 с Status = Active, актуальным ActiveParticipantCount, ростером (per-строка IsActive = State == Joined) и Room = null (токен на чтении не выдаётся).
  • Завершённая конференция. Дано: конференция Ended. Когда актор запрашивает карточку. Тогда 200 с Status = Ended, DurationSeconds, все участники IsActive = false, RecordingStatus — актуальный.
  • Свежесть после потери push. Дано: клиент пропустил realtime-обновление состава. Когда перезапрашивает карточку. Тогда ростер и ActiveParticipantCount отражают текущее состояние на момент чтения (read = source of truth, реалтайм — не source of truth).
  • Не участник чата. Дано: актор не активный участник Deal-чата. Когда запрашивает карточку. Тогда 403 MSG_CHAT_ACCESS_DENIED (наличие конференции косвенно не раскрывается сверх факта доступа к чату).
  • Нет конференции. Дано: ConferenceId не существует. Тогда 404 MSG_CONFERENCE_NOT_FOUND.

Совместимость и наблюдаемость

  • Новые optional поля ответа — additive; удаление/переименование/смена типа — breaking (migration + rollout).
  • Logs: conference read (ConferenceId, Status; токены/медиа не пишутся — их в модели нет); metrics: messenger_conference_get_total{result}, latency p95 (< 500 мс, SLO чтения); traces — сквозной trace (traceparent); dashboard pin-messenger.

Обратные ссылки

Автоссылки: где используется этот документ.

Связанные документы