package handler import ( "log" "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 } // 从上下文获取用户ID userID, exists := c.Get("user_id") if exists { req.UserID = userID.(string) } 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) log.Printf("[ChatGroupHandler] Got response, err: %v", err) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } log.Printf("[ChatGroupHandler] Response subtask_results: %+v", response.SubtaskResults) c.JSON(http.StatusOK, response) }