feat(threads): add basic message thread API and web thread panel
All checks were successful
CI / test (push) Successful in 21s
All checks were successful
CI / test (push) Successful in 21s
This commit is contained in:
@@ -124,6 +124,34 @@ async def search_messages(
|
||||
return list(result.scalars().all())
|
||||
|
||||
|
||||
async def list_message_thread(
|
||||
db: AsyncSession,
|
||||
*,
|
||||
root_message_id: int,
|
||||
user_id: int,
|
||||
limit: int = 100,
|
||||
) -> list[Message]:
|
||||
root = await get_message_by_id(db, root_message_id)
|
||||
if not root:
|
||||
return []
|
||||
stmt = (
|
||||
select(Message)
|
||||
.outerjoin(
|
||||
MessageHidden,
|
||||
(MessageHidden.message_id == Message.id) & (MessageHidden.user_id == user_id),
|
||||
)
|
||||
.where(
|
||||
Message.chat_id == root.chat_id,
|
||||
MessageHidden.id.is_(None),
|
||||
(Message.id == root_message_id) | (Message.reply_to_message_id == root_message_id),
|
||||
)
|
||||
.order_by(Message.id.asc())
|
||||
.limit(max(1, min(limit, 200)))
|
||||
)
|
||||
result = await db.execute(stmt)
|
||||
return list(result.scalars().all())
|
||||
|
||||
|
||||
async def delete_message(db: AsyncSession, message: Message) -> None:
|
||||
await db.delete(message)
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ from app.messages.service import (
|
||||
delete_message_for_all,
|
||||
forward_message,
|
||||
forward_message_bulk,
|
||||
get_message_thread,
|
||||
get_messages,
|
||||
list_message_reactions,
|
||||
search_messages,
|
||||
@@ -59,6 +60,16 @@ async def search_messages_endpoint(
|
||||
return await search_messages(db, user_id=current_user.id, query=query, chat_id=chat_id, limit=limit)
|
||||
|
||||
|
||||
@router.get("/{message_id}/thread", response_model=list[MessageRead])
|
||||
async def message_thread(
|
||||
message_id: int,
|
||||
limit: int = 100,
|
||||
db: AsyncSession = Depends(get_db),
|
||||
current_user: User = Depends(get_current_user),
|
||||
) -> list[MessageRead]:
|
||||
return await get_message_thread(db, message_id=message_id, user_id=current_user.id, limit=limit)
|
||||
|
||||
|
||||
@router.get("/{chat_id}", response_model=list[MessageRead])
|
||||
async def list_messages(
|
||||
chat_id: int,
|
||||
|
||||
@@ -177,6 +177,20 @@ async def search_messages(
|
||||
)
|
||||
|
||||
|
||||
async def get_message_thread(
|
||||
db: AsyncSession,
|
||||
*,
|
||||
message_id: int,
|
||||
user_id: int,
|
||||
limit: int = 100,
|
||||
) -> list[Message]:
|
||||
root = await repository.get_message_by_id(db, message_id)
|
||||
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)
|
||||
|
||||
|
||||
async def update_message(
|
||||
db: AsyncSession,
|
||||
*,
|
||||
|
||||
Reference in New Issue
Block a user