package handler import ( "net/http" "time" "silk-server-go/internal/middleware" "silk-server-go/internal/model" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // RegisterAlarmRoutes 注册告警路由 func RegisterAlarmRoutes(rg *gin.RouterGroup, db *gorm.DB) { rg.GET("/alarms", middleware.RequirePermission(db, "alarm:read"), listAlarms(db)) rg.GET("/alarms/:id", middleware.RequirePermission(db, "alarm:read"), getAlarm(db)) rg.POST("/alarms/:id/ack", middleware.RequirePermission(db, "alarm:ack"), ackAlarm(db)) rg.POST("/alarms/:id/resolve", middleware.RequirePermission(db, "alarm:ack"), resolveAlarm(db)) } // listAlarms 告警列表(query: openOnly,默认上限500,按 triggeredAt DESC) func listAlarms(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { limit := 500 q := db.Model(&model.Alarm{}).Order("triggered_at DESC").Limit(limit) if c.Query("openOnly") == "true" { q = q.Where("open = true") } var alarms []model.Alarm q.Find(&alarms) c.JSON(http.StatusOK, alarms) } } // getAlarm 告警详情 func getAlarm(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { id := c.Param("id") var alarm model.Alarm if db.Where("id = ?", id).First(&alarm).Error != nil { c.JSON(http.StatusNotFound, gin.H{"error": "alarm not found"}) return } c.JSON(http.StatusOK, alarm) } } // ackAlarm 确认告警(设置 acknowledged=true, acknowledgedAt=now) func ackAlarm(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { id := c.Param("id") var alarm model.Alarm if db.Where("id = ?", id).First(&alarm).Error != nil { c.JSON(http.StatusNotFound, gin.H{"error": "alarm not found"}) return } now := time.Now() db.Model(&model.Alarm{}).Where("id = ?", id).Updates(map[string]interface{}{ "acknowledged": true, "acknowledged_at": now, }) db.Where("id = ?", id).First(&alarm) c.JSON(http.StatusOK, alarm) } } // resolveAlarm 解除告警(设置 open=false, resolvedAt=now) func resolveAlarm(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { id := c.Param("id") var alarm model.Alarm if db.Where("id = ?", id).First(&alarm).Error != nil { c.JSON(http.StatusNotFound, gin.H{"error": "alarm not found"}) return } now := time.Now() db.Model(&model.Alarm{}).Where("id = ?", id).Updates(map[string]interface{}{ "open": false, "resolved_at": now, }) db.Where("id = ?", id).First(&alarm) c.JSON(http.StatusOK, alarm) } }