feat(threads): support nested replies in thread API and panel
All checks were successful
CI / test (push) Successful in 31s

This commit is contained in:
2026-03-08 13:40:42 +03:00
parent 88ff11c130
commit 5d69d53301
5 changed files with 81 additions and 5 deletions

View File

@@ -188,7 +188,29 @@ async def get_message_thread(
if not root:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Message not found")
await ensure_chat_membership(db, chat_id=root.chat_id, user_id=user_id)
return await repository.list_message_thread(db, root_message_id=message_id, user_id=user_id, limit=limit)
safe_limit = max(1, min(limit, 500))
collected: dict[int, Message] = {root.id: root}
frontier: list[int] = [root.id]
remaining = safe_limit - 1
while frontier and remaining > 0:
batch = await repository.list_messages_by_parent_ids(
db,
chat_id=root.chat_id,
user_id=user_id,
parent_ids=frontier,
limit=min(remaining, 200),
)
next_frontier: list[int] = []
for message in batch:
if message.id in collected:
continue
collected[message.id] = message
next_frontier.append(message.id)
remaining -= 1
if remaining <= 0:
break
frontier = next_frontier
return sorted(collected.values(), key=lambda item: item.id)
async def update_message(