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)