mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-12-23 14:52:43 +00:00
95 lines
2.1 KiB
Go
95 lines
2.1 KiB
Go
package controller
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/mhsanaei/3x-ui/v2/web/service"
|
|
)
|
|
|
|
// AnalyticsController handles analytics endpoints
|
|
type AnalyticsController struct {
|
|
analyticsService service.AnalyticsService
|
|
}
|
|
|
|
// NewAnalyticsController creates a new analytics controller
|
|
func NewAnalyticsController(g *gin.RouterGroup) *AnalyticsController {
|
|
a := &AnalyticsController{
|
|
analyticsService: service.AnalyticsService{},
|
|
}
|
|
a.initRouter(g)
|
|
return a
|
|
}
|
|
|
|
func (a *AnalyticsController) initRouter(g *gin.RouterGroup) {
|
|
g = g.Group("/analytics")
|
|
g.POST("/hourly", a.getHourlyStats)
|
|
g.POST("/daily", a.getDailyStats)
|
|
g.POST("/top-clients", a.getTopClients)
|
|
}
|
|
|
|
// getHourlyStats gets hourly traffic statistics
|
|
func (a *AnalyticsController) getHourlyStats(c *gin.Context) {
|
|
type request struct {
|
|
InboundID int `json:"inbound_id"`
|
|
}
|
|
|
|
var req request
|
|
if err := c.ShouldBind(&req); err != nil {
|
|
jsonMsg(c, "Invalid request", err)
|
|
return
|
|
}
|
|
|
|
stats, err := a.analyticsService.GetHourlyStats(req.InboundID)
|
|
if err != nil {
|
|
jsonMsg(c, "Failed to get hourly stats", err)
|
|
return
|
|
}
|
|
|
|
jsonObj(c, stats, nil)
|
|
}
|
|
|
|
// getDailyStats gets daily traffic statistics
|
|
func (a *AnalyticsController) getDailyStats(c *gin.Context) {
|
|
type request struct {
|
|
InboundID int `json:"inbound_id"`
|
|
}
|
|
|
|
var req request
|
|
if err := c.ShouldBind(&req); err != nil {
|
|
jsonMsg(c, "Invalid request", err)
|
|
return
|
|
}
|
|
|
|
stats, err := a.analyticsService.GetDailyStats(req.InboundID)
|
|
if err != nil {
|
|
jsonMsg(c, "Failed to get daily stats", err)
|
|
return
|
|
}
|
|
|
|
jsonObj(c, stats, nil)
|
|
}
|
|
|
|
// getTopClients gets top clients by traffic
|
|
func (a *AnalyticsController) getTopClients(c *gin.Context) {
|
|
type request struct {
|
|
InboundID int `json:"inbound_id"`
|
|
Limit int `json:"limit"`
|
|
}
|
|
|
|
var req request
|
|
if err := c.ShouldBind(&req); err != nil {
|
|
jsonMsg(c, "Invalid request", err)
|
|
return
|
|
}
|
|
|
|
if req.Limit <= 0 {
|
|
req.Limit = 10
|
|
}
|
|
|
|
clients, err := a.analyticsService.GetTopClients(req.InboundID, req.Limit)
|
|
if err != nil {
|
|
jsonMsg(c, "Failed to get top clients", err)
|
|
return
|
|
}
|
|
|
|
jsonObj(c, clients, nil)
|
|
}
|