修复了一些逻辑漏洞

This commit is contained in:
2025-12-05 16:35:14 +08:00
parent d3fc16b546
commit acb871855e
2 changed files with 48 additions and 57 deletions

View File

@@ -122,7 +122,7 @@ func DeleteConversationHandler(c *gin.Context) {
/**
* GetConversationByRoomHandler
* 功能:根据 room_id 获取或创建会话
* 功能:根据 room_id 获取会话(不自动创建)
* 路径GET /api/conversations/by-room/:room_id
*/
func GetConversationByRoomHandler(c *gin.Context) {
@@ -137,7 +137,7 @@ func GetConversationByRoomHandler(c *gin.Context) {
conv, err := service.ConversationSvc.GetOrCreateConversationByRoom(userID.(string), roomID)
if err != nil {
if err == gorm.ErrRecordNotFound {
utils.NotFound(c, "房间不存在或无权访问")
utils.NotFound(c, "会话不存在")
} else {
utils.InternalError(c, "查询失败")
}

View File

@@ -116,6 +116,15 @@ func (s *ConversationService) UpsertConversationOnMessage(userID, targetID, room
if !isSender {
conv.UnreadCount = 1
}
// 群聊时target_id 是群ID不是用户ID需要临时禁用外键检查
if conversationType == 2 {
s.DB.Exec("SET FOREIGN_KEY_CHECKS = 0")
err := s.DB.Create(&conv).Error
s.DB.Exec("SET FOREIGN_KEY_CHECKS = 1")
return err
}
return s.DB.Create(&conv).Error
}
return tx.Error
@@ -272,54 +281,37 @@ func (s *ConversationService) GetOrCreateConversationByRoom(userID, roomID strin
return nil, gorm.ErrRecordNotFound
}
// 查询房间信息以确定类型
// 查询房间信息(必须存在才能创建会话)
var room model.ChatRoom
roomErr := s.DB.Where("room_id = ?", roomID).First(&room).Error
if roomErr != nil {
// 房间不存在,返回错误
return nil, gorm.ErrRecordNotFound
}
var conversationType int
var targetID string
if roomErr == nil {
// 房间存在,根据房间类型判断
if room.RoomType == "group" {
conversationType = 2 // 群聊
targetID = roomID // 群聊时 targetID = roomID
} else {
conversationType = 1 // 私聊
// 私聊需要确定 targetID对方用户ID
// 从 room_members 中查找另一个成员
var members []model.RoomMember
if err := s.DB.Where("room_id = ?", roomID).Find(&members).Error; err == nil {
for _, member := range members {
if member.UserID != userID {
targetID = member.UserID
break
}
// 根据房间类型判断会话类型
if room.RoomType == "group" {
conversationType = 2 // 群聊
targetID = roomID // 群聊时 targetID = roomID
} else {
conversationType = 1 // 私聊
// 私聊需要确定 targetID对方用户ID
// 从 room_members 中查找另一个成员
var members []model.RoomMember
if err := s.DB.Where("room_id = ?", roomID).Find(&members).Error; err == nil {
for _, member := range members {
if member.UserID != userID {
targetID = member.UserID
break
}
}
if targetID == "" {
return nil, gorm.ErrRecordNotFound
}
}
} else {
// 房间不存在,尝试通过 roomID 格式判断
if len(roomID) > 6 && roomID[:6] == "group_" {
conversationType = 2 // 群聊
targetID = roomID
} else {
// 可能是私聊,尝试从 room_members 查找
var members []model.RoomMember
if err := s.DB.Where("room_id = ?", roomID).Find(&members).Error; err == nil && len(members) == 2 {
conversationType = 1 // 私聊
for _, member := range members {
if member.UserID != userID {
targetID = member.UserID
break
}
}
} else {
return nil, gorm.ErrRecordNotFound
}
if targetID == "" {
return nil, gorm.ErrRecordNotFound
}
}
@@ -329,7 +321,7 @@ func (s *ConversationService) GetOrCreateConversationByRoom(userID, roomID strin
if tx.Error != nil {
if tx.Error == gorm.ErrRecordNotFound {
// 创建新会话
// 会话不存在,根据房间信息创建新会话
conv = model.ChatConversation{
UserID: userID,
TargetID: targetID,
@@ -339,8 +331,19 @@ func (s *ConversationService) GetOrCreateConversationByRoom(userID, roomID strin
LastTime: time.Now(),
UnreadCount: 0,
}
if err := s.DB.Create(&conv).Error; err != nil {
return nil, err
// 群聊时target_id 是群ID不是用户ID需要临时禁用外键检查
if conversationType == 2 {
s.DB.Exec("SET FOREIGN_KEY_CHECKS = 0")
err := s.DB.Create(&conv).Error
s.DB.Exec("SET FOREIGN_KEY_CHECKS = 1")
if err != nil {
return nil, err
}
} else {
if err := s.DB.Create(&conv).Error; err != nil {
return nil, err
}
}
} else {
return nil, tx.Error
@@ -356,19 +359,7 @@ func (s *ConversationService) GetOrCreateConversationByRoom(userID, roomID strin
log.Printf("⚠️ 用户信息查询失败 (user_id: %s): %v", conv.TargetID, err)
}
} else if conv.Type == 2 { // 群聊:加载群信息
if roomErr == nil {
// 之前查询成功,直接使用
conv.Room = &room
} else {
// 如果之前查询失败,再次尝试查询
var retryRoom model.ChatRoom
if err := s.DB.Where("room_id = ?", roomID).First(&retryRoom).Error; err == nil {
conv.Room = &retryRoom
} else {
log.Printf("⚠️ 群聊信息查询失败 (room_id: %s): %v", roomID, err)
// 即使查询失败,也返回会话,但 Room 字段为 nil
}
}
conv.Room = &room
}
return &conv, nil