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 . import schema
from .handlers import socket_manager 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__) logger = logging.getLogger(__name__)
@@ -34,7 +35,7 @@ chat_router = APIRouter(prefix='/chat', tags=['聊天模块'])
@chat_router.get( @chat_router.get(
'/all/', summary='获取所有聊天', '/all/', summary='获取所有聊天',
response_model=base_schema.BaseResponse[ response_model=base_schema.BaseResponse[
base_schema.Paginated[ schema.ChatPaginated[
List[schema.ChatUnreadOut] List[schema.ChatUnreadOut]
] ]
] ]
@@ -67,11 +68,13 @@ async def get_all_chats(
result = await db_session.execute(query) result = await db_session.execute(query)
chats = result.scalars().all() 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 { return {
'data': { 'data': {
'list': unread_messages_chats_count, 'list': unread_messages_chats,
'unread_messages_total': unread_messages_total,
'next_page': (page * page_size) < total, 'next_page': (page * page_size) < total,
'total': total, 'total': total,
'page': page, 'page': page,

View File

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

View File

@@ -40,6 +40,25 @@ async def get_user_active_direct_chats(
return None 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): async def get_chat_unread_messages_count(db_session: AsyncSession, login_user: LoginUser, chats):
"""查询未读消息的预览""" """查询未读消息的预览"""

View File

@@ -1,5 +1,5 @@
alembic alembic
alembic-async alembic[async]
Brotli Brotli
curl_cffi curl_cffi
httpx httpx