diff --git a/internal/api/conversation_handler.go b/internal/api/conversation_handler.go index cce4e27..a600476 100644 --- a/internal/api/conversation_handler.go +++ b/internal/api/conversation_handler.go @@ -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, "查询失败") } diff --git a/internal/service/conversation_service.go b/internal/service/conversation_service.go index c81af01..36b0df9 100644 --- a/internal/service/conversation_service.go +++ b/internal/service/conversation_service.go @@ -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