feat(chat): 单向聊天可二次激活 单向聊天可二次激活,未删除方聊天消息保留,双向删除后记录清空

This commit is contained in:
xingc
2025-05-16 23:20:02 +08:00
parent 2bbb39529b
commit 72dec3b757
5 changed files with 117 additions and 47 deletions

View File

@@ -10,7 +10,7 @@ from fastapi import WebSocket
from sqlalchemy.ext.asyncio import AsyncSession
from core.db.crud import CRUD
from core.db.models import ReadStatus, User, Chat, Message
from core.db.models import ChatParticipant, User, Chat, Message
from .managers import SocketManager
from . import schema
@@ -29,7 +29,6 @@ async def send_new_message(
incoming_message: schema.WSMessage,
):
chat_guid: str = str(incoming_message.chat_guid)
# chat: Chat | None = await CRUD(db_session, Chat).get(filters={'guid': chat_guid, 'is_deleted': False}
chat: Chat | None = await get_chat(chat_guid, current_user, db_session)
# 判断是否为新聊天
@@ -73,16 +72,7 @@ async def send_new_message(
content=message.content,
friend_user=current_user.dict(),
)
send_status_replay = schema.WSMessageOut(
type='chat.send_status_reply',
message_id=message.id,
message_guid=message.guid,
message_type=message.message_type,
chat_guid=chat.guid,
)
await socket_manager.broadcast_to_chat(chat_guid, send_message_schema.model_dump_json())
await websocket.send_text(send_status_replay.model_dump_json())
@socket_manager.handler('chat.message_read')
@@ -90,16 +80,23 @@ async def read_message(
websocket: WebSocket,
db_session: AsyncSession,
current_user: User,
chats: dict,
incoming_message: schema.WSMessage,
):
last_read_message_id: str | None = incoming_message.content
if not last_read_message_id:
return
db_crud = CRUD(db_session, ReadStatus)
db_crud = CRUD(db_session, ChatParticipant)
chat_guid: str = str(incoming_message.chat_guid)
chat: Chat | None = await get_chat(chat_guid, current_user, db_session)
if chat is None:
await socket_manager.send_error('聊天尚未添加', websocket)
return
condition = {
'user_id': current_user.user_id,
'chat_guid': incoming_message.chat_guid,
'chat_id': chat.id,
}
result = await db_crud.update(filters=condition, data={'last_read_message_id': last_read_message_id})
if result is None: