Files
nl-im-service/internal/service/room_service.go
2025-12-03 11:00:47 +08:00

149 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* package service
* 作用:房间管理服务
*/
package service
import (
"encoding/json"
"fmt"
"time"
"xk-websocket-v2/internal/model"
"xk-websocket-v2/internal/utils"
"gorm.io/gorm"
)
// RoomService 房间服务结构体
type RoomService struct {
DB *gorm.DB
}
// RoomSvc 全局单例
var RoomSvc *RoomService
/**
* InitRoomService
* 功能:初始化房间服务
*/
func InitRoomService(db *gorm.DB) {
RoomSvc = &RoomService{DB: db}
}
/**
* GenerateP2PRoomID
* 功能:生成点对点聊天房间ID
* 规则:将两个用户ID按字母序排序后,用下划线连接
*/
func GenerateP2PRoomID(userID1, userID2 string) string {
if userID1 < userID2 {
return fmt.Sprintf("%s_%s", userID1, userID2)
}
return fmt.Sprintf("%s_%s", userID2, userID1)
}
/**
* GenerateGroupRoomID
* 功能:生成群聊房间ID
* 规则:使用雪花ID生成全局唯一ID
*/
func GenerateGroupRoomID() string {
id, err := utils.NextID()
if err != nil {
// 如果雪花ID生成失败,使用备用方案
return fmt.Sprintf("group_%d", time.Now().UnixNano())
}
return fmt.Sprintf("group_%d", id)
}
/**
* CreateRoom
* 功能:创建房间
*/
func (s *RoomService) CreateRoom(roomType string, members []string, creatorID string) (*model.ChatRoom, error) {
var roomID string
if roomType == "p2p" {
if len(members) != 2 {
return nil, fmt.Errorf("点对点房间需要2个成员")
}
roomID = GenerateP2PRoomID(members[0], members[1])
} else {
roomID = GenerateGroupRoomID()
}
// 检查房间是否已存在
var existingRoom model.ChatRoom
if err := s.DB.Where("room_id = ?", roomID).First(&existingRoom).Error; err == nil {
return &existingRoom, nil
}
// 序列化成员列表
membersJSON, err := json.Marshal(members)
if err != nil {
return nil, err
}
room := model.ChatRoom{
RoomID: roomID,
RoomType: roomType,
Members: string(membersJSON),
CreatorID: creatorID,
}
if roomType == "group" {
room.RoomName = "群聊"
}
if err := s.DB.Create(&room).Error; err != nil {
return nil, err
}
return &room, nil
}
/**
* GetRoom
* 功能:获取房间信息
*/
func (s *RoomService) GetRoom(roomID string) (*model.ChatRoom, error) {
var room model.ChatRoom
result := s.DB.Where("room_id = ?", roomID).First(&room)
if result.Error != nil {
return nil, result.Error
}
return &room, nil
}
/**
* GetOrCreateP2PRoom
* 功能:获取或创建点对点房间
*/
func (s *RoomService) GetOrCreateP2PRoom(userID1, userID2 string) (*model.ChatRoom, error) {
roomID := GenerateP2PRoomID(userID1, userID2)
// 尝试获取现有房间
var room model.ChatRoom
if err := s.DB.Where("room_id = ?", roomID).First(&room).Error; err == nil {
return &room, nil
}
// 创建新房间
members := []string{userID1, userID2}
return s.CreateRoom("p2p", members, userID1)
}
/**
* UpdateRoomLastMessage
* 功能:更新房间最后消息
*/
func (s *RoomService) UpdateRoomLastMessage(roomID, message string) error {
now := time.Now()
return s.DB.Model(&model.ChatRoom{}).
Where("room_id = ?", roomID).
Updates(map[string]interface{}{
"last_message": message,
"last_message_time": now,
}).Error
}