package controller import ( "net/http" "strings" "github.com/mhsanaei/3x-ui/v3/web/middleware" "github.com/mhsanaei/3x-ui/v3/web/service" "github.com/mhsanaei/3x-ui/v3/web/session" "github.com/gin-gonic/gin" ) // APIController handles the main API routes for the 3x-ui panel, including inbounds and server management. type APIController struct { BaseController inboundController *InboundController serverController *ServerController nodeController *NodeController settingService service.SettingService userService service.UserService apiTokenService service.ApiTokenService Tgbot service.Tgbot } // NewAPIController creates a new APIController instance and initializes its routes. func NewAPIController(g *gin.RouterGroup, customGeo *service.CustomGeoService) *APIController { a := &APIController{} a.initRouter(g, customGeo) return a } func (a *APIController) checkAPIAuth(c *gin.Context) { auth := c.GetHeader("Authorization") if strings.HasPrefix(auth, "Bearer ") { tok := strings.TrimPrefix(auth, "Bearer ") if a.apiTokenService.Match(tok) { if u, err := a.userService.GetFirstUser(); err == nil { session.SetAPIAuthUser(c, u) } c.Set("api_authed", true) c.Next() return } } if !session.IsLogin(c) { if c.GetHeader("X-Requested-With") == "XMLHttpRequest" { c.AbortWithStatus(http.StatusUnauthorized) } else { c.AbortWithStatus(http.StatusNotFound) } return } c.Next() } // initRouter sets up the API routes for inbounds, server, and other endpoints. func (a *APIController) initRouter(g *gin.RouterGroup, customGeo *service.CustomGeoService) { // Main API group api := g.Group("/panel/api") api.Use(a.checkAPIAuth) api.Use(middleware.CSRFMiddleware()) // Inbounds API inbounds := api.Group("/inbounds") a.inboundController = NewInboundController(inbounds) // Server API server := api.Group("/server") a.serverController = NewServerController(server) // Nodes API — multi-panel management nodes := api.Group("/nodes") a.nodeController = NewNodeController(nodes) NewCustomGeoController(api.Group("/custom-geo"), customGeo) // Extra routes api.POST("/backuptotgbot", a.BackuptoTgbot) } // BackuptoTgbot sends a backup of the panel data to Telegram bot admins. func (a *APIController) BackuptoTgbot(c *gin.Context) { a.Tgbot.SendBackupToAdmins() }