3.1 KiB
3.1 KiB
ADR-002. Атрибуция аудиотреков и фраз к участнику сеанса (participant_id вместо user_id)
Статус
ПРИНЯТО
Контекст
FR-4.2 ТЗ фиксирует схему phrases (id, user_id, conferences_id, data, t_start, t_end) — атрибуция фразы к зарегистрированному пользователю. После перехода
на динамические конференции (ADR-001) среди участников сеанса есть ГОСТИ без user_id
(conference_participants допускает ровно одну identity: user_id ИЛИ
guest_id). Кроме того, для записи per-track аудио (LiveKit Track Egress)
нужен персистентный маппинг «файл записи ↔ участник сеанса», которого в схеме
нет. Альтернативы:
- пара nullable-колонок
user_id/guest_idвphrases— дублирует CHECK-логикуconference_participantsв каждой таблице пайплайна; - заводить фиктивного user для гостя — нарушает модель auth и FR-1.
Решение
- В
phrasesколонкаuser_idзаменяется наparticipant_id— NOT NULL FK наconference_participants.id(ON DELETE CASCADE). Спикер фразы — всегда строка участника сеанса; имя/email для отображения и рассылки берутся join'ом черезuser_id/guest_idучастника. - Вводится таблица
session_audio_tracks: одна строка на audio-трек сеанса (track SID, egress ID, путь к файлу, статус,started_at,segmentsJSONB) с тем же FKparticipant_id. Она — источник маппинга «файл ↔ спикер» и точка идемпотентного возобновления транскрибации.
Последствия
- Плюсы: гости атрибутируются без костылей; единая точка истины об
identity (
conference_participants); повторное подключение того же пользователя даёт разные строки участника — тайм-окна присутствия точны. - Минусы: выборка фраз «по пользователю» требует join через
conference_participants; отступление от буквы FR-4.2 (фиксируется этим ADR). - Нейтрально:
segmentsJSONB — промежуточный артефакт пайплайна, очищается не обязательно (объём мал: текст+тайминги).
Ссылки
- ADR-001 (динамические конференции, гостевой доступ).
backend/models/phrase.py,backend/models/participant.py,backend/models/audio_track.py.- Сеанс (
conference_sessions) — единица пайплайна пост-обработки.