From d3a5cd12d2d0d9c32af2d5bd9322e030ef69b85d Mon Sep 17 00:00:00 2001 From: Sergey Mankovsky Date: Wed, 3 Dec 2025 16:47:56 +0100 Subject: [PATCH] fix: return participant emails from transcript endpoint (#769) * Return participant emails from transcript endpoint * Fix broken test --- server/reflector/db/users.py | 6 ++++++ server/reflector/views/transcripts.py | 21 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/server/reflector/db/users.py b/server/reflector/db/users.py index ccbe11d6..1224a3bb 100644 --- a/server/reflector/db/users.py +++ b/server/reflector/db/users.py @@ -88,5 +88,11 @@ class UserController: results = await get_database().fetch_all(query) return [User(**r) for r in results] + @staticmethod + async def get_by_ids(user_ids: list[NonEmptyString]) -> dict[str, User]: + query = users.select().where(users.c.id.in_(user_ids)) + results = await get_database().fetch_all(query) + return {user.id: User(**user) for user in results} + user_controller = UserController() diff --git a/server/reflector/views/transcripts.py b/server/reflector/views/transcripts.py index 625a9896..27663dc6 100644 --- a/server/reflector/views/transcripts.py +++ b/server/reflector/views/transcripts.py @@ -37,6 +37,7 @@ from reflector.db.transcripts import ( TranscriptTopic, transcripts_controller, ) +from reflector.db.users import user_controller from reflector.processors.types import Transcript as ProcessorTranscript from reflector.processors.types import Word from reflector.schemas.transcript_formats import TranscriptFormat, TranscriptSegment @@ -111,8 +112,12 @@ class GetTranscriptMinimal(BaseModel): audio_deleted: bool | None = None +class TranscriptParticipantWithEmail(TranscriptParticipant): + email: str | None = None + + class GetTranscriptWithParticipants(GetTranscriptMinimal): - participants: list[TranscriptParticipant] | None + participants: list[TranscriptParticipantWithEmail] | None class GetTranscriptWithText(GetTranscriptWithParticipants): @@ -468,6 +473,18 @@ async def transcript_get( is_multitrack = await _get_is_multitrack(transcript) + participants = [] + if transcript.participants: + user_ids = [p.user_id for p in transcript.participants if p.user_id is not None] + users_dict = await user_controller.get_by_ids(user_ids) if user_ids else {} + for p in transcript.participants: + user = users_dict.get(p.user_id) if p.user_id else None + participants.append( + TranscriptParticipantWithEmail( + **p.model_dump(), email=user.email if user else None + ) + ) + base_data = { "id": transcript.id, "user_id": transcript.user_id, @@ -487,7 +504,7 @@ async def transcript_get( "source_kind": transcript.source_kind, "room_id": transcript.room_id, "audio_deleted": transcript.audio_deleted, - "participants": transcript.participants, + "participants": participants, } if transcript_format == "text":