From 1d8556506eac9851bc77e1234e18df8020b44f36 Mon Sep 17 00:00:00 2001 From: xingc Date: Thu, 16 Oct 2025 19:46:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(chat):=20=E6=96=B0=E5=A2=9E=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E6=B6=88=E6=81=AF=E6=A0=87=E8=AE=B0=E5=B7=B2=E8=AF=BB?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/routers/chat/routes.py | 38 ++++++++++++++++++++++++++++++++++++- core/routers/chat/schema.py | 11 ++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/core/routers/chat/routes.py b/core/routers/chat/routes.py index e4ff617..aad04d8 100644 --- a/core/routers/chat/routes.py +++ b/core/routers/chat/routes.py @@ -69,7 +69,7 @@ async def get_all_chats( chats = result.scalars().all() 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) + unread_messages_total = await get_total_unread_messages_count(db_session, login_user) return { 'data': { @@ -270,6 +270,42 @@ async def delete_single_chat( return {'message': '聊天已删除'} +@chat_router.post( + '/messages/make-all-read', + summary='聊天信息标记为已读', + description='支持批量操作多个聊天', response_model=base_schema.BaseResponse +) +async def make_messages_read( + payload: schema.MakeMessageReadIn, + login_user: LoginUser = Depends(get_current_user_form_http), + db_session: AsyncSession = Depends(get_async_session), +): + db_curd = CRUD(db_session, Chat) + chat_mapping = {str(chat.chat_guid): chat.last_read_message_id for chat in payload.chats} + chats = await db_curd.get_all(filters={'guid__in': chat_mapping.keys()}) + + for chat in chats: + last_read_message_id = chat_mapping.get(chat.guid) + if last_read_message_id and await db_curd.exists( + model=Message, + filters={ + 'id': last_read_message_id, + 'chat_id': chat.id, + } + ): + await db_curd.update( + model=ChatParticipant, + data={'last_read_message_id': last_read_message_id}, + filters={ + 'chat_id': chat.id, + 'user_id': login_user.user_id, + 'last_read_message_id__lt': last_read_message_id, + }, + ) + + return {'message': 'ok'} + + @chat_router.websocket('/ws') async def get_chat_websocket( websocket: WebSocket, diff --git a/core/routers/chat/schema.py b/core/routers/chat/schema.py index cc6ceb8..deb6230 100644 --- a/core/routers/chat/schema.py +++ b/core/routers/chat/schema.py @@ -6,7 +6,7 @@ # @Desc : from typing import Literal, Optional, List -from pydantic import BaseModel, conint, UUID4 +from pydantic import BaseModel, UUID4 from core.base.schema import MessageType, Paginated from core.routers.user.schema import LiteUser @@ -35,6 +35,15 @@ class ChatPaginated(Paginated): unread_messages_total: int +class MakeMessageRead(BaseModel): + chat_guid: UUID4 + last_read_message_id: int + + +class MakeMessageReadIn(BaseModel): + chats: List[MakeMessageRead] + + class ChatUnreadOut(BaseModel): chat_guid: UUID4 created_at: str