package controllers import ( "encoding/json" "fmt" "io" "strconv" "strings" "time" "server/models" "server/pkg/jwtutil" beego "github.com/beego/beego/v2/server/web" ) // BackendAiChatSessionController AI聊天会话控制器 type BackendAiChatSessionController struct { beego.Controller } func (c *BackendAiChatSessionController) sessionClaims() (*jwtutil.Claims, error) { auth := c.Ctx.Request.Header.Get("Authorization") if auth == "" { return nil, fmt.Errorf("未登录") } parts := strings.SplitN(auth, " ", 2) if len(parts) != 2 || parts[0] != "Bearer" { return nil, fmt.Errorf("认证信息格式错误") } claims, err := jwtutil.ParseToken(parts[1]) if err != nil { return nil, fmt.Errorf("无效的token") } if claims.UserType != "backend" { return nil, fmt.Errorf("无权访问") } return claims, nil } func (c *BackendAiChatSessionController) sessionJsonErr(httpStatus, bizCode int, msg string) { c.Ctx.Output.SetStatus(httpStatus) c.Data["json"] = map[string]interface{}{"code": bizCode, "msg": msg} _ = c.ServeJSON() } func (c *BackendAiChatSessionController) sessionOk(data interface{}) { c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success", "data": data} _ = c.ServeJSON() } type chatSessionPayload struct { Title string `json:"title"` ProviderID uint64 `json:"provider_id"` } // List GET /backend/ai/chat/session/list func (c *BackendAiChatSessionController) List() { claims, err := c.sessionClaims() if err != nil { c.sessionJsonErr(401, 401, err.Error()) return } var list []models.BackendAiChatSession _, err = models.Orm.QueryTable(new(models.BackendAiChatSession)). Filter("tenant_id", fmt.Sprintf("%d", claims.TenantId)). Filter("user_id", uint64(claims.UserID)). Filter("delete_time__isnull", true). OrderBy("-update_time"). All(&list) if err != nil { c.sessionJsonErr(500, 500, "查询失败: "+err.Error()) return } c.sessionOk(map[string]interface{}{"list": list}) } // Create POST /backend/ai/chat/session func (c *BackendAiChatSessionController) Create() { claims, err := c.sessionClaims() if err != nil { c.sessionJsonErr(401, 401, err.Error()) return } body, err := io.ReadAll(c.Ctx.Request.Body) if err != nil { c.sessionJsonErr(400, 400, "读取请求体失败") return } var p chatSessionPayload if err := json.Unmarshal(body, &p); err != nil { c.sessionJsonErr(400, 400, "参数格式错误") return } title := strings.TrimSpace(p.Title) if title == "" { title = "新对话" } session := models.BackendAiChatSession{ TenantID: fmt.Sprintf("%d", claims.TenantId), UserID: uint64(claims.UserID), ProviderID: p.ProviderID, Title: title, CreateTime: time.Now(), UpdateTime: time.Now(), } id, err := models.Orm.Insert(&session) if err != nil { c.sessionJsonErr(500, 500, "创建失败: "+err.Error()) return } c.sessionOk(map[string]interface{}{"id": id, "title": title}) } // Update PUT /backend/ai/chat/session/:id(重命名) func (c *BackendAiChatSessionController) Update() { claims, err := c.sessionClaims() if err != nil { c.sessionJsonErr(401, 401, err.Error()) return } idStr := c.Ctx.Input.Param(":id") id, err := strconv.ParseUint(idStr, 10, 64) if err != nil { c.sessionJsonErr(400, 400, "ID格式错误") return } session := models.BackendAiChatSession{ID: id} if err := models.Orm.Read(&session); err != nil { c.sessionJsonErr(404, 404, "会话不存在") return } if session.TenantID != fmt.Sprintf("%d", claims.TenantId) || session.UserID != uint64(claims.UserID) { c.sessionJsonErr(403, 403, "无权操作") return } body, err := io.ReadAll(c.Ctx.Request.Body) if err != nil { c.sessionJsonErr(400, 400, "读取请求体失败") return } var p chatSessionPayload if err := json.Unmarshal(body, &p); err != nil { c.sessionJsonErr(400, 400, "参数格式错误") return } if strings.TrimSpace(p.Title) != "" { session.Title = strings.TrimSpace(p.Title) } if p.ProviderID > 0 { session.ProviderID = p.ProviderID } session.UpdateTime = time.Now() _, err = models.Orm.Update(&session) if err != nil { c.sessionJsonErr(500, 500, "更新失败: "+err.Error()) return } c.sessionOk(nil) } // Delete DELETE /backend/ai/chat/session/:id func (c *BackendAiChatSessionController) Delete() { claims, err := c.sessionClaims() if err != nil { c.sessionJsonErr(401, 401, err.Error()) return } idStr := c.Ctx.Input.Param(":id") id, err := strconv.ParseUint(idStr, 10, 64) if err != nil { c.sessionJsonErr(400, 400, "ID格式错误") return } session := models.BackendAiChatSession{ID: id} if err := models.Orm.Read(&session); err != nil { c.sessionJsonErr(404, 404, "会话不存在") return } if session.TenantID != fmt.Sprintf("%d", claims.TenantId) || session.UserID != uint64(claims.UserID) { c.sessionJsonErr(403, 403, "无权操作") return } now := time.Now() session.DeleteTime = &now _, err = models.Orm.Update(&session, "delete_time") if err != nil { c.sessionJsonErr(500, 500, "删除失败: "+err.Error()) return } c.sessionOk(nil) }