Files
silk/server-go/internal/handler/alarm.go
T

86 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}
}