修改通话请求的状态字段

This commit is contained in:
2025-07-16 10:33:59 +08:00
parent 8fa8ba4a2b
commit b2c02c1db3
7 changed files with 181 additions and 7 deletions

View File

@@ -7,12 +7,14 @@ import (
"log"
"net/http"
"os"
"strconv"
"sync"
"time"
"github.com/gin-gonic/gin"
"github.com/go-redis/redis/v8"
"github.com/gorilla/websocket"
"gorm.io/gorm"
"xk-websocket/models"
"xk-websocket/utils"
)
@@ -35,12 +37,14 @@ type WebSocketController struct {
Port string
RedisCtx context.Context
Logger *log.Logger
DB *gorm.DB // 数据库连接
}
func NewWebSocketController() *WebSocketController {
func NewWebSocketController(db *gorm.DB) *WebSocketController {
return &WebSocketController{
Clients: make(map[string]*websocket.Conn),
RedisCtx: context.Background(),
DB: db, // 初始化数据库连接
}
}
@@ -711,6 +715,7 @@ func (c *WebSocketController) BindHandler(ctx *gin.Context) {
req.UserID, req.ClientID, time.Since(start))
}
// SendToUserHandler 通过用户ID发送消息处理器支持通话信令
// SendToUserHandler 通过用户ID发送消息处理器支持通话信令
func (c *WebSocketController) SendToUserHandler(ctx *gin.Context) {
start := time.Now()
@@ -732,6 +737,24 @@ func (c *WebSocketController) SendToUserHandler(ctx *gin.Context) {
log.Printf("📤📤📤📤📤📤📤📤 处理API用户发送请求: \n SenderUser=%s → ReceiverUser=%s \n MsgType=%d",
payload.SenderUserID, payload.ReceiverUserID, payload.MessageType)
// 创建消息记录
chatMsg := models.XkChatMessage{
RoomId: payload.RoomId,
SenderUserID: payload.SenderUserID,
ReceiverUserID: payload.ReceiverUserID,
MessageType: payload.MessageType,
MessageContent: payload.MessageContent,
CallID: payload.CallID,
CallStatus: payload.CallStatus,
}
// 保存到数据库
if err := c.DB.Create(&chatMsg).Error; err != nil {
log.Printf("❌ 保存消息到数据库失败: %v", err)
} else {
log.Printf("💾 消息保存到数据库成功: ID=%d", chatMsg.ID)
}
// 创建基础消息结构
clientMsg := models.ClientReceivedMessage{
SenderID: "system",
@@ -767,6 +790,86 @@ func (c *WebSocketController) SendToUserHandler(ctx *gin.Context) {
log.Printf("✅ API用户发送请求完成: Duration=%s", time.Since(start))
}
// 获取聊天记录(分页)
func (c *WebSocketController) GetMessagesHandler(ctx *gin.Context) {
// 解析查询参数
roomId := ctx.Query("room_id")
senderUserId := ctx.Query("sender_user_id")
receiverUserId := ctx.Query("receiver_user_id")
page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(ctx.DefaultQuery("page_size", "15"))
if page < 1 {
page = 1
}
if pageSize < 1 || pageSize > 100 {
pageSize = 15
}
offset := (page - 1) * pageSize
// 构建查询
query := c.DB.Model(&models.XkChatMessage{})
if roomId != "" {
query = query.Where("room_id = ?", roomId)
}
if senderUserId != "" {
query = query.Where("sender_user_id = ?", senderUserId)
}
if receiverUserId != "" {
query = query.Where("receiver_user_id = ?", receiverUserId)
}
// 获取总数
var total int64
query.Count(&total)
// 获取分页数据
var messages []models.XkChatMessage
if err := query.Order("created_at DESC").Offset(offset).Limit(pageSize).Find(&messages).Error; err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{"error": "获取消息失败"})
return
}
ctx.JSON(http.StatusOK, gin.H{
"status": "success",
"data": messages,
"total": total,
"page": page,
"hasNext": total > int64(offset+pageSize),
})
}
// 同步聊天记录(全部)
func (c *WebSocketController) SyncMessagesHandler(ctx *gin.Context) {
roomId := ctx.Query("room_id")
senderUserId := ctx.Query("sender_user_id")
receiverUserId := ctx.Query("receiver_user_id")
query := c.DB.Model(&models.XkChatMessage{})
if roomId != "" {
query = query.Where("room_id = ?", roomId)
}
if senderUserId != "" {
query = query.Where("sender_user_id = ?", senderUserId)
}
if receiverUserId != "" {
query = query.Where("receiver_user_id = ?", receiverUserId)
}
var messages []models.XkChatMessage
if err := query.Order("created_at ASC").Find(&messages).Error; err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{"error": "获取消息失败"})
return
}
ctx.JSON(http.StatusOK, gin.H{
"status": "success",
"data": messages,
})
}
// 添加客户端连接
func (c *WebSocketController) addClient(clientID string, conn *websocket.Conn) {
c.ClientsMux.Lock()