gcx/blockchain/bridge-monitor/internal/handler/handler.go

71 lines
1.8 KiB
Go

package handler
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"github.com/gogenex/bridge-monitor/internal/monitor"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
func NewRouter(reconciler *monitor.BridgeMonitor, metrics *monitor.Metrics) *gin.Engine {
r := gin.Default()
v1 := r.Group("/v1/bridge")
{
v1.GET("/status", func(c *gin.Context) {
result := reconciler.GetLatestResult()
if result == nil {
c.JSON(http.StatusOK, gin.H{"status": "no_data", "message": "No reconciliation performed yet"})
return
}
c.JSON(http.StatusOK, gin.H{
"status": boolToStatus(result.Healthy),
"tvl": result.EthLocked,
"ethLocked": result.EthLocked,
"genexMinted": result.GenexMinted,
"discrepancy": result.Discrepancy,
"lastCheck": result.Timestamp,
})
})
v1.GET("/reconciliation", func(c *gin.Context) {
result := reconciler.GetLatestResult()
if result == nil {
c.JSON(http.StatusOK, gin.H{"message": "No reconciliation data"})
return
}
c.JSON(http.StatusOK, result)
})
v1.GET("/history", func(c *gin.Context) {
n, _ := strconv.Atoi(c.DefaultQuery("limit", "50"))
history := reconciler.GetHistory(n)
c.JSON(http.StatusOK, gin.H{"count": len(history), "results": history})
})
v1.POST("/pause", func(c *gin.Context) {
// 紧急暂停(需要认证)
c.JSON(http.StatusOK, gin.H{"status": "pause_requested", "message": "Emergency pause proposal created"})
})
}
r.GET("/metrics", gin.WrapH(promhttp.Handler()))
r.GET("/health", func(c *gin.Context) {
result := reconciler.GetLatestResult()
healthy := result == nil || result.Healthy
c.JSON(http.StatusOK, gin.H{"status": boolToStatus(healthy)})
})
return r
}
func boolToStatus(healthy bool) string {
if healthy {
return "healthy"
}
return "unhealthy"
}