From f5ce84ae68c68b9669be363c9484521617683d87 Mon Sep 17 00:00:00 2001 From: Hassan Ali Gilani Date: Sun, 14 Jul 2024 03:08:30 -0700 Subject: [PATCH] Add getClientTrafficsById (#1347) * Add getClientTrafficsById Ability for API to get traffics by uuid * bugfix GetClientTrafficByID * bugfix GetClientTrafficByID * Update GetClientTrafficByID function by Alireza0 Recomendation * update Replace Logger Warning with Debug for GetClientTrafficByID * Fix: return empty array instead of error in case of gorm.ErrRecordNotFound --------- Co-authored-by: Ali Gilani --- README.md | 1 + web/controller/api.go | 1 + web/controller/inbound.go | 9 +++++++++ web/service/inbound.go | 19 +++++++++++++++++++ 4 files changed, 30 insertions(+) diff --git a/README.md b/README.md index 01354f87..dc98ef89 100644 --- a/README.md +++ b/README.md @@ -232,6 +232,7 @@ docker build -t x-ui . | `POST` | `"/:id/delClient/:clientId"` | Delete client by clientId\* | | `POST` | `"/updateClient/:clientId"` | Update client by clientId\* | | `GET` | `"/getClientTraffics/:email"` | Get client's traffic | +| `GET` | `"/getClientTrafficsById/:id"` | Get client's traffic By ID | | `POST` | `"/:id/resetClientTraffic/:email"` | Reset client's traffic | | `POST` | `"/resetAllTraffics"` | Reset traffics of all inbounds | | `POST` | `"/resetAllClientTraffics/:id"` | Reset inbound clients traffics (-1: all) | diff --git a/web/controller/api.go b/web/controller/api.go index 7802dea5..3408fabc 100644 --- a/web/controller/api.go +++ b/web/controller/api.go @@ -33,6 +33,7 @@ func (a *APIController) initRouter(g *gin.RouterGroup) { {"GET", "/", a.inboundController.getInbounds}, {"GET", "/get/:id", a.inboundController.getInbound}, {"GET", "/getClientTraffics/:email", a.inboundController.getClientTraffics}, + {"GET", "/getClientTrafficsById/:id", a.inboundController.getClientTrafficsById}, {"POST", "/add", a.inboundController.addInbound}, {"POST", "/del/:id", a.inboundController.delInbound}, {"POST", "/update/:id", a.inboundController.updateInbound}, diff --git a/web/controller/inbound.go b/web/controller/inbound.go index f80d57fd..bee88677 100644 --- a/web/controller/inbound.go +++ b/web/controller/inbound.go @@ -75,6 +75,15 @@ func (a *InboundController) getClientTraffics(c *gin.Context) { jsonObj(c, clientTraffics, nil) } +func (a *InboundController) getClientTrafficsById(c *gin.Context) { + id := c.Param("id") + clientTraffics, err := a.inboundService.GetClientTrafficByID(id) + if err != nil { + jsonMsg(c, "Error getting traffics", err) + return + } + jsonObj(c, clientTraffics, nil) +} func (a *InboundController) addInbound(c *gin.Context) { inbound := &model.Inbound{} err := c.ShouldBind(inbound) diff --git a/web/service/inbound.go b/web/service/inbound.go index 424be726..44f2633b 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -1292,6 +1292,25 @@ func (s *InboundService) GetClientTrafficByEmail(email string) (traffic *xray.Cl return nil, nil } +func (s *InboundService) GetClientTrafficByID(id string) ([]xray.ClientTraffic, error) { + db := database.GetDB() + var traffics []xray.ClientTraffic + + err := db.Model(xray.ClientTraffic{}).Where(`email IN( + SELECT JSON_EXTRACT(client.value, '$.email') as email + FROM inbounds, + JSON_EACH(JSON_EXTRACT(inbounds.settings, '$.clients')) AS client + WHERE + JSON_EXTRACT(client.value, '$.id') in (?) + )`, id).Find(&traffics).Error + + if err != nil { + logger.Debug(err) + return nil, err + } + return traffics, err +} + func (s *InboundService) SearchClientTraffic(query string) (traffic *xray.ClientTraffic, err error) { db := database.GetDB() inbound := &model.Inbound{}