package handler import ( "net/http" "github.com/gin-gonic/gin" "zeromesh/internal/database" "zeromesh/internal/model" "zeromesh/internal/service" ) type AdminHandler struct { authService *service.AuthService db *database.DB nodeService *service.NodeService netService *service.NetworkService } func NewAdminHandler(authService *service.AuthService, db *database.DB, nodeService *service.NodeService, netService *service.NetworkService) *AdminHandler { return &AdminHandler{ authService: authService, db: db, nodeService: nodeService, netService: netService, } } func (h *AdminHandler) Dashboard(c *gin.Context) { uid := userID(c) var authorizedMembers int64 if isAdmin(c) { h.db.Model(&model.NetworkMember{}).Where("authorized = ?", true).Count(&authorizedMembers) } else { networks, _ := h.netService.ListNetworks(uid) var ids []uint32 for _, n := range networks { ids = append(ids, n.NetworkID) } if len(ids) > 0 { h.db.Model(&model.NetworkMember{}).Where("authorized = ? AND network_id IN ?", true, ids).Count(&authorizedMembers) } } nodes, _ := h.nodeService.ListNode(uid) var online int64 for _, n := range nodes { if n.Online { online++ } } networks, _ := h.netService.ListNetworks(uid) c.JSON(http.StatusOK, gin.H{ "authorized_members": authorizedMembers, "nodes_total": len(nodes), "nodes_online": online, "networks_count": len(networks), }) }