- handler: agent_handler, memory_handler, skill_handler - model: agent.go, skill.go - repository: agent_repo, skill_repo - service: agent_service, memory_service, skill_service - 新增 migrations 目录 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
173 lines
4.7 KiB
Go
173 lines
4.7 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"x-agents/server/internal/model"
|
|
"x-agents/server/internal/service"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// SkillHandler 技能处理器
|
|
type SkillHandler struct {
|
|
skillService *service.SkillService
|
|
}
|
|
|
|
// NewSkillHandler 创建技能处理器
|
|
func NewSkillHandler(skillService *service.SkillService) *SkillHandler {
|
|
return &SkillHandler{skillService: skillService}
|
|
}
|
|
|
|
// List 获取技能列表
|
|
// @Summary 获取技能列表
|
|
// @Description 获取所有技能列表,支持按类型筛选(system/user)
|
|
// @Tags 技能管理
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param type query string false "技能类型: system(系统技能)/user(用户技能)"
|
|
// @Success 200 {object} map[string]interface{} "{"list": [], "total": 0}"
|
|
// @Router /skill/list [get]
|
|
func (h *SkillHandler) List(c *gin.Context) {
|
|
skillType := c.Query("type")
|
|
|
|
var skills []model.Skill
|
|
var err error
|
|
|
|
if skillType != "" {
|
|
skills, err = h.skillService.GetSkillsByType(skillType)
|
|
} else {
|
|
skills, err = h.skillService.GetAllSkills()
|
|
}
|
|
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"list": skills, "total": len(skills)})
|
|
}
|
|
|
|
// Sync 手动同步 skills
|
|
// @Summary 手动同步技能
|
|
// @Description 从文件系统扫描 skills 目录并同步到数据库。扫描 account/admin/skills(系统技能) 和 account/{username}/skills(用户技能)
|
|
// @Tags 技能管理
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {object} map[string]interface{} "{"message": "skills synced", "count": 0}"
|
|
// @Router /skill/sync [get]
|
|
func (h *SkillHandler) Sync(c *gin.Context) {
|
|
if err := h.skillService.InitSkills(); err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
skills, _ := h.skillService.GetAllSkills()
|
|
c.JSON(http.StatusOK, gin.H{"message": "skills synced", "count": len(skills)})
|
|
}
|
|
|
|
// GetByID 根据ID获取技能
|
|
// @Summary 获取技能详情
|
|
// @Description 根据ID获取技能详情
|
|
// @Tags 技能管理
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "技能ID"
|
|
// @Success 200 {object} map[string]interface{} "{"skill": {}}"
|
|
// @Router /skill/{id} [get]
|
|
func (h *SkillHandler) GetByID(c *gin.Context) {
|
|
id := c.Param("id")
|
|
if id == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "skill id is required"})
|
|
return
|
|
}
|
|
|
|
skill, err := h.skillService.GetSkillByID(id)
|
|
if err != nil {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "skill not found"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"skill": skill})
|
|
}
|
|
|
|
// Create 创建技能
|
|
// @Summary 创建技能
|
|
// @Description 创建新的技能
|
|
// @Tags 技能管理
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param skill body model.Skill true "技能信息"
|
|
// @Success 200 {object} map[string]interface{} "{"message": "skill created", "skill": {}}"
|
|
// @Router /skill/add [post]
|
|
func (h *SkillHandler) Create(c *gin.Context) {
|
|
var skill model.Skill
|
|
if err := c.ShouldBindJSON(&skill); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
if err := h.skillService.CreateSkill(&skill); err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "skill created", "skill": skill})
|
|
}
|
|
|
|
// Update 更新技能
|
|
// @Summary 更新技能
|
|
// @Description 更新技能信息
|
|
// @Tags 技能管理
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "技能ID"
|
|
// @Param skill body model.Skill true "技能信息"
|
|
// @Success 200 {object} map[string]interface{} "{"message": "skill updated"}"
|
|
// @Router /skill/{id} [put]
|
|
func (h *SkillHandler) Update(c *gin.Context) {
|
|
id := c.Param("id")
|
|
if id == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "skill id is required"})
|
|
return
|
|
}
|
|
|
|
var skill model.Skill
|
|
if err := c.ShouldBindJSON(&skill); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
skill.ID = id
|
|
if err := h.skillService.UpdateSkill(&skill); err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "skill updated"})
|
|
}
|
|
|
|
// Delete 删除技能
|
|
// @Summary 删除技能
|
|
// @Description 删除技能
|
|
// @Tags 技能管理
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "技能ID"
|
|
// @Success 200 {object} map[string]interface{} "{"message": "skill deleted"}"
|
|
// @Router /skill/{id} [delete]
|
|
func (h *SkillHandler) Delete(c *gin.Context) {
|
|
id := c.Param("id")
|
|
if id == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "skill id is required"})
|
|
return
|
|
}
|
|
|
|
if err := h.skillService.DeleteSkill(id); err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "skill deleted"})
|
|
}
|