This commit is contained in:
2026-06-13 10:40:59 +08:00
parent ebcfb0c258
commit 318ddd85a5
15 changed files with 614 additions and 30 deletions
@@ -115,6 +115,33 @@ class ConversationService:
raise ValueError("群主不能退出,请先转让群主身份")
member.left_at = datetime.utcnow()
async def dissolve_group(self, conv_id: str, user_id: str):
"""解散群聊(仅群主)"""
member = await self._get_member(conv_id, user_id)
if not member:
raise ValueError("你不在该群中")
if member.role != "owner":
raise ValueError("只有群主可以解散群聊")
# 验证会话存在且为群聊
conv_result = await self.db.execute(
select(Conversation).where(Conversation.id == conv_id)
)
conv = conv_result.scalars().first()
if not conv or conv.type != "group":
raise ValueError("群聊不存在")
# 软删除所有成员(设置 left_at)
members_result = await self.db.execute(
select(ConversationMember).where(
ConversationMember.conversation_id == conv_id,
ConversationMember.left_at.is_(None),
)
)
now = datetime.utcnow()
for m in members_result.scalars().all():
m.left_at = now
async def update_member_role(self, conv_id: str, user_id: str, target_user_id: str, role: str):
"""修改成员角色(仅群主)"""
member = await self._get_member(conv_id, user_id)
+19
View File
@@ -85,6 +85,23 @@ class MessageService:
select(User).where(User.id == msg.sender_id)
)
sender = sender_result.scalars().first()
# 获取被引用消息的信息
reply_to_content = None
reply_to_sender_name = None
if msg.reply_to_id:
reply_msg_result = await self.db.execute(
select(Message).where(Message.id == msg.reply_to_id)
)
reply_msg = reply_msg_result.scalars().first()
if reply_msg:
reply_to_content = reply_msg.content[:200] if reply_msg.content else None
reply_sender_result = await self.db.execute(
select(User).where(User.id == reply_msg.sender_id)
)
reply_sender = reply_sender_result.scalars().first()
reply_to_sender_name = reply_sender.username if reply_sender else None
message_list.append({
"id": msg.id,
"conversation_id": msg.conversation_id,
@@ -94,6 +111,8 @@ class MessageService:
"type": msg.type,
"content": msg.content,
"reply_to_id": msg.reply_to_id,
"reply_to_content": reply_to_content,
"reply_to_sender_name": reply_to_sender_name,
"is_deleted": msg.is_deleted,
"created_at": msg.created_at,
})