修复了一些逻辑漏洞
This commit is contained in:
@@ -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, "查询失败")
|
||||
}
|
||||
|
||||
@@ -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,15 +281,19 @@ 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
|
||||
@@ -301,27 +314,6 @@ func (s *ConversationService) GetOrCreateConversationByRoom(userID, roomID strin
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 查询会话
|
||||
var conv model.ChatConversation
|
||||
@@ -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,9 +331,20 @@ func (s *ConversationService) GetOrCreateConversationByRoom(userID, roomID strin
|
||||
LastTime: time.Now(),
|
||||
UnreadCount: 0,
|
||||
}
|
||||
|
||||
// 群聊时,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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return &conv, nil
|
||||
|
||||
Reference in New Issue
Block a user