package controller import ( "net/http" "strconv" "ezops/middleware" "ezops/model" "ezops/pkg/siteprobe" "github.com/gin-gonic/gin" ) // GetTaskContent 返回某任务的内容监控视图:当前基线 + 待确认变更 + 结构化 diff。 // // 前端详情页用这一个接口即可渲染"基线 / 待确认 / 并排对比"三块。 // Logan.Li // GET /api/v1/site/tasks/:id/content func (h *SiteHandler) GetTaskContent(c *gin.Context) { taskID, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil || taskID == 0 { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "任务 ID 无效"}) return } var task model.SiteTask if err := h.db.First(&task, taskID).Error; err != nil { c.JSON(http.StatusNotFound, model.Response{Code: 404, Message: "任务不存在"}) return } var baseline model.SiteBaseline hasBaseline := false if task.CurrentBaselineID > 0 { if err := h.db.First(&baseline, task.CurrentBaselineID).Error; err == nil { hasBaseline = true } } var pending model.SiteContentChange hasPending := false if err := h.db.Where("task_id = ? AND status = ?", task.ID, model.ContentChangePending). Order("id DESC").Take(&pending).Error; err == nil { hasPending = true } var baselineCount int64 h.db.Model(&model.SiteBaseline{}).Where("task_id = ?", task.ID).Count(&baselineCount) var pendingCount int64 h.db.Model(&model.SiteContentChange{}). Where("task_id = ? AND status = ?", task.ID, model.ContentChangePending).Count(&pendingCount) data := gin.H{ "task_id": task.ID, "enabled": siteprobe.ContentCheckEnabled(task.ContentCheckMode), "mode": task.ContentCheckMode, "content_paths": task.ContentPaths, "content_ignore": task.ContentIgnoreRules, "min_length": task.ContentMinLength, "confirm_times": task.ContentConfirmTimes, "sort_lines": task.ContentSortLines, "baseline_count": baselineCount, "pending_change_count": pendingCount, "has_baseline": hasBaseline, "has_pending": hasPending, } if hasBaseline { data["baseline"] = baseline } if hasPending { data["pending"] = pending } c.JSON(http.StatusOK, model.Response{Code: 200, Message: "success", Data: data}) } // ListBaselines 内容基线版本历史。 // Logan.Li // GET /api/v1/site/tasks/:id/baselines func (h *SiteHandler) ListBaselines(c *gin.Context) { taskID, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil || taskID == 0 { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "任务 ID 无效"}) return } var items []model.SiteBaseline h.db.Where("task_id = ?", taskID).Order("version DESC").Find(&items) if items == nil { items = []model.SiteBaseline{} } c.JSON(http.StatusOK, model.Response{Code: 200, Message: "success", Data: items}) } // ListContentChanges 内容变更记录(支持 status 过滤)。 // Logan.Li // GET /api/v1/site/tasks/:id/changes func (h *SiteHandler) ListContentChanges(c *gin.Context) { taskID, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil || taskID == 0 { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "任务 ID 无效"}) return } q := h.db.Where("task_id = ?", taskID) if status := c.Query("status"); status != "" { q = q.Where("status = ?", status) } var items []model.SiteContentChange q.Order("id DESC").Limit(100).Find(&items) if items == nil { items = []model.SiteContentChange{} } c.JSON(http.StatusOK, model.Response{Code: 200, Message: "success", Data: items}) } // AcceptContentChange 接受某次变更作为新基线。 // // 必须人工确认:真实上游变更与"我方采集配置错误"需要人来判断, // 全自动接受会让告警彻底失去意义。 // Logan.Li // POST /api/v1/site/changes/:id/accept func (h *SiteHandler) AcceptContentChange(c *gin.Context) { id, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil || id == 0 { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "变更 ID 无效"}) return } var req struct { Note string `json:"note"` } _ = c.ShouldBindJSON(&req) user := middleware.GetUsername(c) if err := siteprobe.AcceptChange(h.db, uint(id), user, req.Note); err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: err.Error()}) return } c.JSON(http.StatusOK, model.Response{Code: 200, Message: "已接受为新基线"}) } // IgnoreContentChange 将变更标记为误报忽略(不更新基线)。 // Logan.Li // POST /api/v1/site/changes/:id/ignore func (h *SiteHandler) IgnoreContentChange(c *gin.Context) { id, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil || id == 0 { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "变更 ID 无效"}) return } user := middleware.GetUsername(c) if err := siteprobe.IgnoreChange(h.db, uint(id), user); err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: err.Error()}) return } c.JSON(http.StatusOK, model.Response{Code: 200, Message: "已忽略该变更"}) }