package handler import ( "fmt" "net/http" "strconv" "silk-server-go/internal/middleware" "silk-server-go/internal/model" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // RegisterAlarmClipRoutes 注册告警视频片段路由 func RegisterAlarmClipRoutes(rg *gin.RouterGroup, db *gorm.DB) { rg.GET("/alarms/:id/clip", middleware.RequirePermission(db, "alarm:read"), getAlarmClip(db)) } // getAlarmClip 获取告警关联视频片段(查 video_clips 表 where alarm_id=:id,按 start_at DESC) func getAlarmClip(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { userID := currentUserID(c) if userID == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "未提供用户信息"}) return } 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 } var clips []model.VideoClip db.Where("alarm_id = ?", id).Order("start_at DESC").Find(&clips) // 为每个片段设置 playbackUrl for i := range clips { token, err := IssueVideoToken(*userID, "clip", strconv.FormatUint(uint64(clips[i].ID), 10), videoTokenTTL) if err != nil { continue } url := fmt.Sprintf("/api/v1/video/clips/%d/stream?videoToken=%s", clips[i].ID, token) clips[i].PlaybackURL = &url } c.JSON(http.StatusOK, clips) } }