diff --git a/core/routers/chat/routes.py b/core/routers/chat/routes.py index b573377..e4ff617 100644 --- a/core/routers/chat/routes.py +++ b/core/routers/chat/routes.py @@ -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, diff --git a/core/routers/chat/schema.py b/core/routers/chat/schema.py index 9e72b10..cc6ceb8 100644 --- a/core/routers/chat/schema.py +++ b/core/routers/chat/schema.py @@ -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 diff --git a/core/routers/chat/services.py b/core/routers/chat/services.py index 842117a..2b72ef9 100644 --- a/core/routers/chat/services.py +++ b/core/routers/chat/services.py @@ -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): """查询未读消息的预览""" diff --git a/requirements.txt b/requirements.txt index 64b75be..09bb04b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ alembic -alembic-async +alembic[async] Brotli curl_cffi httpx