feat(chat): 聊天列表新增未读消息总数

This commit is contained in:
xingc
2025-07-02 16:16:05 +08:00
parent 72dec3b757
commit 57d71af146
4 changed files with 32 additions and 7 deletions

View File

@@ -24,7 +24,8 @@ from core.base.exceptions import WebsocketTooManyRequests
from . import schema
from .handlers import socket_manager
from .services import websocket_callback, get_user_active_direct_chats, get_unread_messages_per_chat, get_chat
from .services import websocket_callback, get_user_active_direct_chats, get_unread_messages_per_chat, get_chat, \
get_total_unread_messages_count
logger = logging.getLogger(__name__)
@@ -34,7 +35,7 @@ chat_router = APIRouter(prefix='/chat', tags=['聊天模块'])
@chat_router.get(
'/all/', summary='获取所有聊天',
response_model=base_schema.BaseResponse[
base_schema.Paginated[
schema.ChatPaginated[
List[schema.ChatUnreadOut]
]
]
@@ -67,11 +68,13 @@ async def get_all_chats(
result = await db_session.execute(query)
chats = result.scalars().all()
unread_messages_chats_count = await get_unread_messages_per_chat(db_session, chats, login_user)
unread_messages_chats = await get_unread_messages_per_chat(db_session, chats, login_user)
unread_messages_total = await get_total_unread_messages_count(db_session, login_user)
return {
'data': {
'list': unread_messages_chats_count,
'list': unread_messages_chats,
'unread_messages_total': unread_messages_total,
'next_page': (page * page_size) < total,
'total': total,
'page': page,

View File

@@ -4,12 +4,11 @@
# @Software : PyCharm
# @Author : xingc
# @Desc :
from datetime import datetime
from typing import Literal, Optional, List
from pydantic import BaseModel, conint, UUID4
from core.base.schema import MessageType
from core.base.schema import MessageType, Paginated
from core.routers.user.schema import LiteUser
@@ -32,6 +31,10 @@ class PreviewMessage(BaseModel):
content: str
class ChatPaginated(Paginated):
unread_messages_total: int
class ChatUnreadOut(BaseModel):
chat_guid: UUID4
created_at: str

View File

@@ -40,6 +40,25 @@ async def get_user_active_direct_chats(
return None
async def get_total_unread_messages_count(db_session: AsyncSession, login_user: LoginUser) -> int:
"""获取未读消息总数"""
query = (
select(func.count(Message.id))
.join(
ChatParticipant,
and_(
Message.chat_id == ChatParticipant.chat_id,
ChatParticipant.user_id == login_user.user_id
)
)
.filter(
Message.id > ChatParticipant.last_read_message_id,
Message.user_id != login_user.user_id,
ChatParticipant.is_deleted == False
)
)
result = await db_session.execute(query)
return result.scalar()
async def get_chat_unread_messages_count(db_session: AsyncSession, login_user: LoginUser, chats):
"""查询未读消息的预览"""