feat(chat): 新增聊天消息标记已读接口
This commit is contained in:
@@ -270,6 +270,42 @@ async def delete_single_chat(
|
|||||||
return {'message': '聊天已删除'}
|
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')
|
@chat_router.websocket('/ws')
|
||||||
async def get_chat_websocket(
|
async def get_chat_websocket(
|
||||||
websocket: WebSocket,
|
websocket: WebSocket,
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
# @Desc :
|
# @Desc :
|
||||||
from typing import Literal, Optional, List
|
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.base.schema import MessageType, Paginated
|
||||||
from core.routers.user.schema import LiteUser
|
from core.routers.user.schema import LiteUser
|
||||||
@@ -35,6 +35,15 @@ class ChatPaginated(Paginated):
|
|||||||
unread_messages_total: int
|
unread_messages_total: int
|
||||||
|
|
||||||
|
|
||||||
|
class MakeMessageRead(BaseModel):
|
||||||
|
chat_guid: UUID4
|
||||||
|
last_read_message_id: int
|
||||||
|
|
||||||
|
|
||||||
|
class MakeMessageReadIn(BaseModel):
|
||||||
|
chats: List[MakeMessageRead]
|
||||||
|
|
||||||
|
|
||||||
class ChatUnreadOut(BaseModel):
|
class ChatUnreadOut(BaseModel):
|
||||||
chat_guid: UUID4
|
chat_guid: UUID4
|
||||||
created_at: str
|
created_at: str
|
||||||
|
|||||||
Reference in New Issue
Block a user