| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- 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()
- }
|