initial: ZeroTier-like P2P mesh VPN server with multi-tenant Web UI
This commit is contained in:
62
internal/handler/admin.go
Normal file
62
internal/handler/admin.go
Normal file
@@ -0,0 +1,62 @@
|
||||
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),
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user