Files
zeromesh/internal/handler/node.go

82 lines
2.0 KiB
Go

package handler
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
"zeromesh/internal/service"
)
type NodeHandler struct {
nodeService *service.NodeService
}
func NewNodeHandler(nodeService *service.NodeService) *NodeHandler {
return &NodeHandler{nodeService: nodeService}
}
type registerNodeReq struct {
NodeID string `json:"node_id" binding:"required"`
PublicKey string `json:"public_key" binding:"required"`
Name string `json:"name"`
IPAddress string `json:"ip_address"`
Port int `json:"port"`
Version string `json:"version"`
}
func (h *NodeHandler) Register(c *gin.Context) {
var req registerNodeReq
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
uid := userID(c)
node, err := h.nodeService.Register(req.NodeID, req.PublicKey, req.Name, req.IPAddress, req.Port, req.Version, uid)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"node": node})
}
func (h *NodeHandler) List(c *gin.Context) {
uid := userID(c)
if !isAdmin(c) {
nodes, err := h.nodeService.ListNode(uid)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"nodes": nodes})
return
}
nodes, err := h.nodeService.ListNode(0)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"nodes": nodes})
}
func (h *NodeHandler) ListOnline(c *gin.Context) {
uid := userID(c)
nodes, err := h.nodeService.ListOnline(uid)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"nodes": nodes})
}
func (h *NodeHandler) Heartbeat(c *gin.Context) {
nodeID := c.Param("node_id")
if err := h.nodeService.SetOnline(nodeID, true); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
time.Sleep(5 * time.Second)
c.JSON(http.StatusOK, gin.H{"status": "ok"})
}