group.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package controller
  2. import (
  3. "strings"
  4. "github.com/mhsanaei/3x-ui/v3/internal/util/common"
  5. "github.com/mhsanaei/3x-ui/v3/internal/web/service"
  6. "github.com/gin-gonic/gin"
  7. )
  8. type GroupController struct {
  9. clientService service.ClientService
  10. xrayService service.XrayService
  11. }
  12. func NewGroupController(g *gin.RouterGroup) *GroupController {
  13. a := &GroupController{}
  14. a.initRouter(g)
  15. return a
  16. }
  17. func (a *GroupController) initRouter(g *gin.RouterGroup) {
  18. g.GET("/groups", a.list)
  19. g.GET("/groups/:name/emails", a.emails)
  20. g.POST("/groups/create", a.create)
  21. g.POST("/groups/rename", a.rename)
  22. g.POST("/groups/delete", a.delete)
  23. g.POST("/groups/resetTraffic", a.resetTraffic)
  24. g.POST("/groups/bulkAdd", a.bulkAdd)
  25. g.POST("/groups/bulkRemove", a.bulkRemove)
  26. }
  27. func (a *GroupController) list(c *gin.Context) {
  28. rows, err := a.clientService.ListGroups()
  29. if err != nil {
  30. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  31. return
  32. }
  33. jsonObj(c, rows, nil)
  34. }
  35. func (a *GroupController) emails(c *gin.Context) {
  36. name := c.Param("name")
  37. emails, err := a.clientService.EmailsByGroup(name)
  38. if err != nil {
  39. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  40. return
  41. }
  42. jsonObj(c, emails, nil)
  43. }
  44. type groupCreateBody struct {
  45. Name string `json:"name"`
  46. }
  47. func (a *GroupController) create(c *gin.Context) {
  48. var body groupCreateBody
  49. if err := c.ShouldBindJSON(&body); err != nil {
  50. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  51. return
  52. }
  53. if err := a.clientService.CreateGroup(body.Name); err != nil {
  54. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  55. return
  56. }
  57. jsonObj(c, gin.H{"name": body.Name}, nil)
  58. notifyClientsChanged()
  59. }
  60. type groupRenameBody struct {
  61. OldName string `json:"oldName"`
  62. NewName string `json:"newName"`
  63. }
  64. func (a *GroupController) rename(c *gin.Context) {
  65. var body groupRenameBody
  66. if err := c.ShouldBindJSON(&body); err != nil {
  67. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  68. return
  69. }
  70. affected, err := a.clientService.RenameGroup(body.OldName, body.NewName)
  71. if err != nil {
  72. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  73. return
  74. }
  75. a.xrayService.SetToNeedRestart()
  76. jsonObj(c, gin.H{"affected": affected}, nil)
  77. notifyClientsChanged()
  78. }
  79. type groupDeleteBody struct {
  80. Name string `json:"name"`
  81. }
  82. func (a *GroupController) delete(c *gin.Context) {
  83. var body groupDeleteBody
  84. if err := c.ShouldBindJSON(&body); err != nil {
  85. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  86. return
  87. }
  88. affected, err := a.clientService.DeleteGroup(body.Name)
  89. if err != nil {
  90. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  91. return
  92. }
  93. a.xrayService.SetToNeedRestart()
  94. jsonObj(c, gin.H{"affected": affected}, nil)
  95. notifyClientsChanged()
  96. }
  97. type groupResetTrafficBody struct {
  98. Name string `json:"name"`
  99. }
  100. func (a *GroupController) resetTraffic(c *gin.Context) {
  101. var body groupResetTrafficBody
  102. if err := c.ShouldBindJSON(&body); err != nil {
  103. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  104. return
  105. }
  106. if err := a.clientService.ResetGroupTraffic(body.Name); err != nil {
  107. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  108. return
  109. }
  110. jsonObj(c, gin.H{"name": body.Name}, nil)
  111. notifyClientsChanged()
  112. }
  113. type bulkAddToGroupRequest struct {
  114. Emails []string `json:"emails"`
  115. Group string `json:"group"`
  116. }
  117. func (a *GroupController) bulkAdd(c *gin.Context) {
  118. var req bulkAddToGroupRequest
  119. if err := c.ShouldBindJSON(&req); err != nil {
  120. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  121. return
  122. }
  123. if strings.TrimSpace(req.Group) == "" {
  124. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), common.NewError("group name is required"))
  125. return
  126. }
  127. affected, err := a.clientService.AddToGroup(req.Emails, req.Group)
  128. if err != nil {
  129. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  130. return
  131. }
  132. jsonObj(c, gin.H{"affected": affected}, nil)
  133. a.xrayService.SetToNeedRestart()
  134. notifyClientsChanged()
  135. }
  136. type bulkRemoveFromGroupRequest struct {
  137. Emails []string `json:"emails"`
  138. }
  139. func (a *GroupController) bulkRemove(c *gin.Context) {
  140. var req bulkRemoveFromGroupRequest
  141. if err := c.ShouldBindJSON(&req); err != nil {
  142. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  143. return
  144. }
  145. affected, err := a.clientService.RemoveFromGroup(req.Emails)
  146. if err != nil {
  147. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  148. return
  149. }
  150. jsonObj(c, gin.H{"affected": affected}, nil)
  151. a.xrayService.SetToNeedRestart()
  152. notifyClientsChanged()
  153. }