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"}) }