group.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package controller
  2. import (
  3. "strings"
  4. "github.com/mhsanaei/3x-ui/v3/util/common"
  5. "github.com/mhsanaei/3x-ui/v3/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/bulkAdd", a.bulkAdd)
  24. g.POST("/groups/bulkRemove", a.bulkRemove)
  25. }
  26. func (a *GroupController) list(c *gin.Context) {
  27. rows, err := a.clientService.ListGroups()
  28. if err != nil {
  29. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  30. return
  31. }
  32. jsonObj(c, rows, nil)
  33. }
  34. func (a *GroupController) emails(c *gin.Context) {
  35. name := c.Param("name")
  36. emails, err := a.clientService.EmailsByGroup(name)
  37. if err != nil {
  38. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  39. return
  40. }
  41. jsonObj(c, emails, nil)
  42. }
  43. type groupCreateBody struct {
  44. Name string `json:"name"`
  45. }
  46. func (a *GroupController) create(c *gin.Context) {
  47. var body groupCreateBody
  48. if err := c.ShouldBindJSON(&body); err != nil {
  49. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  50. return
  51. }
  52. if err := a.clientService.CreateGroup(body.Name); err != nil {
  53. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  54. return
  55. }
  56. jsonObj(c, gin.H{"name": body.Name}, nil)
  57. notifyClientsChanged()
  58. }
  59. type groupRenameBody struct {
  60. OldName string `json:"oldName"`
  61. NewName string `json:"newName"`
  62. }
  63. func (a *GroupController) rename(c *gin.Context) {
  64. var body groupRenameBody
  65. if err := c.ShouldBindJSON(&body); err != nil {
  66. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  67. return
  68. }
  69. affected, err := a.clientService.RenameGroup(body.OldName, body.NewName)
  70. if err != nil {
  71. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  72. return
  73. }
  74. a.xrayService.SetToNeedRestart()
  75. jsonObj(c, gin.H{"affected": affected}, nil)
  76. notifyClientsChanged()
  77. }
  78. type groupDeleteBody struct {
  79. Name string `json:"name"`
  80. }
  81. func (a *GroupController) delete(c *gin.Context) {
  82. var body groupDeleteBody
  83. if err := c.ShouldBindJSON(&body); err != nil {
  84. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  85. return
  86. }
  87. affected, err := a.clientService.DeleteGroup(body.Name)
  88. if err != nil {
  89. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  90. return
  91. }
  92. a.xrayService.SetToNeedRestart()
  93. jsonObj(c, gin.H{"affected": affected}, nil)
  94. notifyClientsChanged()
  95. }
  96. type bulkAddToGroupRequest struct {
  97. Emails []string `json:"emails"`
  98. Group string `json:"group"`
  99. }
  100. func (a *GroupController) bulkAdd(c *gin.Context) {
  101. var req bulkAddToGroupRequest
  102. if err := c.ShouldBindJSON(&req); err != nil {
  103. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  104. return
  105. }
  106. if strings.TrimSpace(req.Group) == "" {
  107. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), common.NewError("group name is required"))
  108. return
  109. }
  110. affected, err := a.clientService.AddToGroup(req.Emails, req.Group)
  111. if err != nil {
  112. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  113. return
  114. }
  115. jsonObj(c, gin.H{"affected": affected}, nil)
  116. a.xrayService.SetToNeedRestart()
  117. notifyClientsChanged()
  118. }
  119. type bulkRemoveFromGroupRequest struct {
  120. Emails []string `json:"emails"`
  121. }
  122. func (a *GroupController) bulkRemove(c *gin.Context) {
  123. var req bulkRemoveFromGroupRequest
  124. if err := c.ShouldBindJSON(&req); err != nil {
  125. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  126. return
  127. }
  128. affected, err := a.clientService.RemoveFromGroup(req.Emails)
  129. if err != nil {
  130. jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
  131. return
  132. }
  133. jsonObj(c, gin.H{"affected": affected}, nil)
  134. a.xrayService.SetToNeedRestart()
  135. notifyClientsChanged()
  136. }