mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-05-31 10:14:15 +00:00
155 lines
3.8 KiB
Go
155 lines
3.8 KiB
Go
|
|
package controller
|
||
|
|
|
||
|
|
import (
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
"github.com/mhsanaei/3x-ui/v3/util/common"
|
||
|
|
"github.com/mhsanaei/3x-ui/v3/web/service"
|
||
|
|
|
||
|
|
"github.com/gin-gonic/gin"
|
||
|
|
)
|
||
|
|
|
||
|
|
type GroupController struct {
|
||
|
|
clientService service.ClientService
|
||
|
|
xrayService service.XrayService
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewGroupController(g *gin.RouterGroup) *GroupController {
|
||
|
|
a := &GroupController{}
|
||
|
|
a.initRouter(g)
|
||
|
|
return a
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a *GroupController) initRouter(g *gin.RouterGroup) {
|
||
|
|
g.GET("/groups", a.list)
|
||
|
|
g.GET("/groups/:name/emails", a.emails)
|
||
|
|
g.POST("/groups/create", a.create)
|
||
|
|
g.POST("/groups/rename", a.rename)
|
||
|
|
g.POST("/groups/delete", a.delete)
|
||
|
|
g.POST("/groups/bulkAdd", a.bulkAdd)
|
||
|
|
g.POST("/groups/bulkRemove", a.bulkRemove)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a *GroupController) list(c *gin.Context) {
|
||
|
|
rows, err := a.clientService.ListGroups()
|
||
|
|
if err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
jsonObj(c, rows, nil)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a *GroupController) emails(c *gin.Context) {
|
||
|
|
name := c.Param("name")
|
||
|
|
emails, err := a.clientService.EmailsByGroup(name)
|
||
|
|
if err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
jsonObj(c, emails, nil)
|
||
|
|
}
|
||
|
|
|
||
|
|
type groupCreateBody struct {
|
||
|
|
Name string `json:"name"`
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a *GroupController) create(c *gin.Context) {
|
||
|
|
var body groupCreateBody
|
||
|
|
if err := c.ShouldBindJSON(&body); err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if err := a.clientService.CreateGroup(body.Name); err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
jsonObj(c, gin.H{"name": body.Name}, nil)
|
||
|
|
notifyClientsChanged()
|
||
|
|
}
|
||
|
|
|
||
|
|
type groupRenameBody struct {
|
||
|
|
OldName string `json:"oldName"`
|
||
|
|
NewName string `json:"newName"`
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a *GroupController) rename(c *gin.Context) {
|
||
|
|
var body groupRenameBody
|
||
|
|
if err := c.ShouldBindJSON(&body); err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
affected, err := a.clientService.RenameGroup(body.OldName, body.NewName)
|
||
|
|
if err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
a.xrayService.SetToNeedRestart()
|
||
|
|
jsonObj(c, gin.H{"affected": affected}, nil)
|
||
|
|
notifyClientsChanged()
|
||
|
|
}
|
||
|
|
|
||
|
|
type groupDeleteBody struct {
|
||
|
|
Name string `json:"name"`
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a *GroupController) delete(c *gin.Context) {
|
||
|
|
var body groupDeleteBody
|
||
|
|
if err := c.ShouldBindJSON(&body); err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
affected, err := a.clientService.DeleteGroup(body.Name)
|
||
|
|
if err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
a.xrayService.SetToNeedRestart()
|
||
|
|
jsonObj(c, gin.H{"affected": affected}, nil)
|
||
|
|
notifyClientsChanged()
|
||
|
|
}
|
||
|
|
|
||
|
|
type bulkAddToGroupRequest struct {
|
||
|
|
Emails []string `json:"emails"`
|
||
|
|
Group string `json:"group"`
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a *GroupController) bulkAdd(c *gin.Context) {
|
||
|
|
var req bulkAddToGroupRequest
|
||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if strings.TrimSpace(req.Group) == "" {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), common.NewError("group name is required"))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
affected, err := a.clientService.AddToGroup(req.Emails, req.Group)
|
||
|
|
if err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
jsonObj(c, gin.H{"affected": affected}, nil)
|
||
|
|
a.xrayService.SetToNeedRestart()
|
||
|
|
notifyClientsChanged()
|
||
|
|
}
|
||
|
|
|
||
|
|
type bulkRemoveFromGroupRequest struct {
|
||
|
|
Emails []string `json:"emails"`
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a *GroupController) bulkRemove(c *gin.Context) {
|
||
|
|
var req bulkRemoveFromGroupRequest
|
||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
affected, err := a.clientService.RemoveFromGroup(req.Emails)
|
||
|
|
if err != nil {
|
||
|
|
jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
jsonObj(c, gin.H{"affected": affected}, nil)
|
||
|
|
a.xrayService.SetToNeedRestart()
|
||
|
|
notifyClientsChanged()
|
||
|
|
}
|