98 lines
2.7 KiB
Go
98 lines
2.7 KiB
Go
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{}).
|
||
Joins("LEFT JOIN devices d ON d.device_key = alarms.device_key").
|
||
Order("alarms.triggered_at DESC").Limit(limit)
|
||
q = applyRoomScope(q, c, "d.room_id")
|
||
if c.Query("openOnly") == "true" {
|
||
q = q.Where("alarms.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")
|
||
if !requireObjectAccess(c, db, "alarm", id) {
|
||
return
|
||
}
|
||
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")
|
||
if !requireObjectAccess(c, db, "alarm", id) {
|
||
return
|
||
}
|
||
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")
|
||
if !requireObjectAccess(c, db, "alarm", id) {
|
||
return
|
||
}
|
||
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)
|
||
}
|
||
}
|