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