From a50fd946eb79f8d73b5a3ec66f95dea45eb68bd3 Mon Sep 17 00:00:00 2001 From: Markov Date: Mon, 23 Feb 2026 13:26:57 +0100 Subject: [PATCH] fix: broadcast message.new from REST API via WebSocket --- src/tracker/api/messages.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/tracker/api/messages.py b/src/tracker/api/messages.py index cd04854..52ee1d3 100644 --- a/src/tracker/api/messages.py +++ b/src/tracker/api/messages.py @@ -120,6 +120,41 @@ async def create_message(req: MessageCreate, db: AsyncSession = Depends(get_db)) select(Message).where(Message.id == msg.id).options(selectinload(Message.attachments)) ) msg = result2.scalar_one() + + # Broadcast via WebSocket + from tracker.ws.manager import manager + msg_data = { + "id": str(msg.id), + "chat_id": req.chat_id, + "task_id": req.task_id, + "author_type": msg.author_type, + "author_slug": msg.author_slug, + "content": msg.content, + "mentions": msg.mentions or [], + "created_at": msg.created_at.isoformat(), + } + + project_id = None + if req.chat_id: + chat_result = await db.execute(select(Chat).where(Chat.id == uuid.UUID(req.chat_id))) + chat = chat_result.scalar_one_or_none() + if chat and chat.project_id: + project_id = str(chat.project_id) + elif chat and chat.kind == "lobby": + await manager.broadcast_all( + {"type": "message.new", "data": msg_data}, + exclude=msg.author_slug, + ) + return _message_out(msg) + + if project_id: + await manager.broadcast_message(project_id, msg_data, author_slug=msg.author_slug) + else: + await manager.broadcast_all( + {"type": "message.new", "data": msg_data}, + exclude=msg.author_slug, + ) + return _message_out(msg)