2026-03-13 14:31:42 +08:00
|
|
|
|
package handler
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2026-03-13 21:26:27 +08:00
|
|
|
|
"log"
|
2026-03-13 14:31:42 +08:00
|
|
|
|
"net/http"
|
|
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
|
|
|
|
"x-agents/server/internal/model"
|
|
|
|
|
|
"x-agents/server/internal/service"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// ChatGroupHandler 群聊处理器
|
|
|
|
|
|
type ChatGroupHandler struct {
|
|
|
|
|
|
groupService *service.ChatGroupService
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// NewChatGroupHandler 创建群聊处理器
|
|
|
|
|
|
func NewChatGroupHandler(groupService *service.ChatGroupService) *ChatGroupHandler {
|
|
|
|
|
|
return &ChatGroupHandler{
|
|
|
|
|
|
groupService: groupService,
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CreateGroup 创建群聊
|
|
|
|
|
|
func (h *ChatGroupHandler) CreateGroup(c *gin.Context) {
|
|
|
|
|
|
var req model.CreateGroupRequest
|
|
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
|
|
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-15 19:49:27 +08:00
|
|
|
|
// 从上下文获取用户ID,如果存在则覆盖请求中的user_id
|
2026-03-13 14:31:42 +08:00
|
|
|
|
userID, exists := c.Get("user_id")
|
|
|
|
|
|
if exists {
|
|
|
|
|
|
req.UserID = userID.(string)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-15 19:49:27 +08:00
|
|
|
|
// 验证user_id
|
|
|
|
|
|
if req.UserID == "" {
|
|
|
|
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "user_id is required"})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-13 14:31:42 +08:00
|
|
|
|
group, err := h.groupService.CreateGroup(req)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.JSON(http.StatusCreated, group)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ListGroups 获取群聊列表
|
|
|
|
|
|
func (h *ChatGroupHandler) ListGroups(c *gin.Context) {
|
|
|
|
|
|
userID := c.Query("user_id")
|
|
|
|
|
|
if userID == "" {
|
|
|
|
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "user_id is required"})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
limit, _ := strconv.Atoi(c.DefaultQuery("limit", "20"))
|
|
|
|
|
|
offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
|
|
|
|
|
|
|
|
|
|
|
|
groups, total, err := h.groupService.ListGroups(userID, limit, offset)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.JSON(http.StatusOK, gin.H{"list": groups, "total": total})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetGroup 获取群聊详情
|
|
|
|
|
|
func (h *ChatGroupHandler) GetGroup(c *gin.Context) {
|
|
|
|
|
|
id := c.Param("id")
|
|
|
|
|
|
|
|
|
|
|
|
group, err := h.groupService.GetGroup(id)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "Group not found"})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.JSON(http.StatusOK, group)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// UpdateGroup 更新群聊
|
|
|
|
|
|
func (h *ChatGroupHandler) UpdateGroup(c *gin.Context) {
|
|
|
|
|
|
id := c.Param("id")
|
|
|
|
|
|
|
|
|
|
|
|
var req model.UpdateGroupRequest
|
|
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
|
|
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
group, err := h.groupService.UpdateGroup(id, req)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.JSON(http.StatusOK, group)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// DeleteGroup 删除群聊
|
|
|
|
|
|
func (h *ChatGroupHandler) DeleteGroup(c *gin.Context) {
|
|
|
|
|
|
id := c.Param("id")
|
|
|
|
|
|
|
|
|
|
|
|
err := h.groupService.DeleteGroup(id)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c.JSON(http.StatusOK, gin.H{"success": true})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GroupChat 群聊对话
|
|
|
|
|
|
func (h *ChatGroupHandler) GroupChat(c *gin.Context) {
|
|
|
|
|
|
id := c.Param("id")
|
|
|
|
|
|
|
|
|
|
|
|
// 获取群聊信息
|
|
|
|
|
|
group, err := h.groupService.GetGroup(id)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "Group not found"})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var req model.GroupChatRequest
|
|
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
|
|
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取用户ID
|
|
|
|
|
|
userID := ""
|
|
|
|
|
|
if uid, exists := c.Get("user_id"); exists {
|
|
|
|
|
|
userID = uid.(string)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果没有提供 Agent IDs,使用群聊中配置的
|
|
|
|
|
|
agentIDs := req.AgentIDs
|
|
|
|
|
|
if agentIDs == "" {
|
|
|
|
|
|
agentIDs = group.AgentIDs
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
response, err := h.groupService.GroupChat(userID, req.Message, agentIDs, req.SessionID)
|
2026-03-13 21:26:27 +08:00
|
|
|
|
log.Printf("[ChatGroupHandler] Got response, err: %v", err)
|
2026-03-13 14:31:42 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-13 21:26:27 +08:00
|
|
|
|
log.Printf("[ChatGroupHandler] Response subtask_results: %+v", response.SubtaskResults)
|
|
|
|
|
|
|
2026-03-13 14:31:42 +08:00
|
|
|
|
c.JSON(http.StatusOK, response)
|
|
|
|
|
|
}
|