feat: 新增Chat会话和群聊API
- 新增chat_session相关模型、仓库和服务 - 新增chat_group相关模型、仓库和服务 - 新增session_handler和chat_group_handler - 实现会话管理和群聊功能 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
149
server/internal/handler/chat_group_handler.go
Normal file
149
server/internal/handler/chat_group_handler.go
Normal file
@@ -0,0 +1,149 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"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)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, response)
|
||||
}
|
||||
Reference in New Issue
Block a user