Add video download failure reporting feature
- Introduced a new API endpoint `POST /api/v1/video/remove_watermark/report_failure` for reporting download failures. - Added a new database table `video_download_failures` to store details about failed downloads, including domain, URL, error message, and reporting metadata. - Updated the video handler to process failure reports and save them to the database. - Enhanced documentation to include details about the new reporting feature and its usage.
This commit is contained in:
@@ -3,6 +3,9 @@ package handler
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
@@ -25,6 +28,14 @@ type removeWatermarkRequest struct {
|
||||
Content string `json:"content" binding:"required"`
|
||||
}
|
||||
|
||||
type reportDownloadFailureRequest struct {
|
||||
Domain string `json:"domain"`
|
||||
FailedURL string `json:"failedUrl" binding:"required"`
|
||||
ErrorMessage string `json:"errorMessage"`
|
||||
Timestamp int64 `json:"timestamp"`
|
||||
UserAgent string `json:"userAgent"`
|
||||
}
|
||||
|
||||
func (h *VideoHandler) RemoveWatermark(c *gin.Context) {
|
||||
var req removeWatermarkRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
@@ -84,3 +95,52 @@ func (h *VideoHandler) UnlockQuota(c *gin.Context) {
|
||||
"unlocked": true,
|
||||
}))
|
||||
}
|
||||
|
||||
func (h *VideoHandler) ReportDownloadFailure(c *gin.Context) {
|
||||
var req reportDownloadFailureRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "请求参数错误"))
|
||||
return
|
||||
}
|
||||
|
||||
failedURL := strings.TrimSpace(req.FailedURL)
|
||||
if failedURL == "" {
|
||||
c.JSON(http.StatusBadRequest, model.Error(http.StatusBadRequest, "failedUrl 不能为空"))
|
||||
return
|
||||
}
|
||||
|
||||
reportedAt := time.Now()
|
||||
if req.Timestamp > 0 {
|
||||
reportedAt = time.UnixMilli(req.Timestamp)
|
||||
}
|
||||
|
||||
domain := strings.TrimSpace(req.Domain)
|
||||
if domain == "" {
|
||||
if parsed, err := url.Parse(failedURL); err == nil {
|
||||
domain = parsed.Host
|
||||
}
|
||||
}
|
||||
|
||||
userAgent := strings.TrimSpace(req.UserAgent)
|
||||
if userAgent == "" {
|
||||
userAgent = c.Request.UserAgent()
|
||||
}
|
||||
|
||||
report := service.DownloadFailureReport{
|
||||
Domain: domain,
|
||||
FailedURL: failedURL,
|
||||
ErrorMessage: req.ErrorMessage,
|
||||
ReportedAt: reportedAt,
|
||||
UserAgent: userAgent,
|
||||
ClientIP: c.ClientIP(),
|
||||
}
|
||||
|
||||
if err := h.videoService.ReportDownloadFailure(c.Request.Context(), report); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, model.Error(http.StatusInternalServerError, "上报失败,请稍后重试"))
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, model.Success(gin.H{
|
||||
"reported": true,
|
||||
}))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user