package handler import ( "net/http" "time" "mengyamonitor-backend-server/internal/model" "mengyamonitor-backend-server/internal/store" "github.com/gin-gonic/gin" ) type Public struct { Store *store.Store } // publicServer hides agent_key from unauthenticated API consumers. type publicServer struct { ID string `json:"id"` Name string `json:"name"` URL string `json:"url"` Enabled bool `json:"enabled"` SortOrder int `json:"sortOrder"` CreatedAt time.Time `json:"createdAt,omitempty"` } func toPublicServers(in []model.MonitoredServer) []publicServer { out := make([]publicServer, 0, len(in)) for _, s := range in { out = append(out, publicServer{ ID: s.ID, Name: s.Name, URL: s.URL, Enabled: s.Enabled, SortOrder: s.SortOrder, CreatedAt: s.CreatedAt, }) } return out } func (h *Public) Health(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"status": "ok"}) } func (h *Public) ListServers(c *gin.Context) { list, err := h.Store.ListEnabled(c.Request.Context()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"data": toPublicServers(list)}) } func (h *Public) Root(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "service": "萌芽监控 — 中心服务", "version": "1.0.0", "public": []string{ "GET /api/health", "GET /api/servers", "GET /api/ws/monitor — WebSocket 指标快照", "gRPC AgentIngest — 见环境变量 GRPC_PORT", }, "admin": []string{ "POST /api/admin/auth", "GET /api/admin/servers", "POST /api/admin/servers", "PUT /api/admin/servers/:id", "DELETE /api/admin/servers/:id", "PUT /api/admin/servers/reorder", }, }) }