first commit
This commit is contained in:
92
cmd/api/main.go
Normal file
92
cmd/api/main.go
Normal file
@@ -0,0 +1,92 @@
|
||||
//go:build ignore
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
"strings"
|
||||
"xboard-go/internal/config"
|
||||
"xboard-go/internal/database"
|
||||
"xboard-go/internal/handler"
|
||||
"xboard-go/internal/middleware"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Initialize configuration
|
||||
config.LoadConfig()
|
||||
|
||||
// Initialize database
|
||||
database.InitDB()
|
||||
|
||||
// Initialize Gin router
|
||||
r := gin.Default()
|
||||
|
||||
// Global Middleware
|
||||
r.Use(gin.Recovery())
|
||||
|
||||
// API Groups
|
||||
v1 := r.Group("/api/v1")
|
||||
{
|
||||
// Passport (Auth)
|
||||
passport := v1.Group("/passport")
|
||||
{
|
||||
passport.POST("/login", handler.Login)
|
||||
passport.POST("/register", handler.Register)
|
||||
}
|
||||
|
||||
// Subscription (Client) Routes
|
||||
v1.GET("/s/:token", handler.Subscribe)
|
||||
|
||||
// Authenticated Routes
|
||||
auth := v1.Group("")
|
||||
auth.Use(middleware.Auth())
|
||||
{
|
||||
// User module
|
||||
user := auth.Group("/user")
|
||||
{
|
||||
user.GET("/info", handler.UserInfo)
|
||||
}
|
||||
}
|
||||
|
||||
// Admin Routes
|
||||
admin := auth.Group("/admin")
|
||||
admin.Use(middleware.AdminAuth())
|
||||
{
|
||||
admin.GET("/stats", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{"message": "Admin Stats"})
|
||||
})
|
||||
}
|
||||
|
||||
// Admin Portal (Secure Path Entry)
|
||||
v1.GET("/:path", handler.AdminPortal)
|
||||
v1.GET("/:path/realname", handler.RealNameIndex)
|
||||
|
||||
// Plugin API (Secure Path)
|
||||
realname := v1.Group("/api/v1/:path/realname")
|
||||
realname.Use(middleware.AdminAuth()) // Ensure only admins can access plugin APIs
|
||||
{
|
||||
realname.GET("/records", handler.RealNameRecords)
|
||||
realname.POST("/review/:id", handler.RealNameReview)
|
||||
}
|
||||
|
||||
// Node (UniProxy) Routes
|
||||
server := v1.Group("/server")
|
||||
server.Use(middleware.NodeAuth())
|
||||
{
|
||||
uniProxy := server.Group("/uniProxy")
|
||||
{
|
||||
uniProxy.GET("/user", handler.NodeUser)
|
||||
uniProxy.POST("/push", handler.NodePush)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Start server
|
||||
log.Printf("Server starting on port %s", config.AppConfig.AppPort)
|
||||
if err := r.Run(":" + config.AppConfig.AppPort); err != nil {
|
||||
log.Fatalf("Failed to start server: %v", err)
|
||||
}
|
||||
}
|
||||
245
cmd/api/main_entry.go
Normal file
245
cmd/api/main_entry.go
Normal file
@@ -0,0 +1,245 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"xboard-go/internal/config"
|
||||
"xboard-go/internal/database"
|
||||
"xboard-go/internal/handler"
|
||||
"xboard-go/internal/middleware"
|
||||
"xboard-go/internal/service"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func main() {
|
||||
config.LoadConfig()
|
||||
database.InitDB()
|
||||
database.InitCache()
|
||||
|
||||
router := gin.New()
|
||||
router.Use(gin.Logger(), gin.Recovery())
|
||||
|
||||
api := router.Group("/api")
|
||||
registerV1(api.Group("/v1"))
|
||||
registerV2(api.Group("/v2"))
|
||||
registerWebRoutes(router)
|
||||
|
||||
log.Printf("server starting on port %s", config.AppConfig.AppPort)
|
||||
if err := router.Run(":" + config.AppConfig.AppPort); err != nil {
|
||||
log.Fatalf("failed to start server: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func registerV1(v1 *gin.RouterGroup) {
|
||||
registerPassportRoutes(v1)
|
||||
registerGuestRoutes(v1)
|
||||
registerUserRoutes(v1)
|
||||
registerClientRoutes(v1)
|
||||
registerServerRoutesV1(v1)
|
||||
registerPluginRoutesV1(v1)
|
||||
}
|
||||
|
||||
func registerV2(v2 *gin.RouterGroup) {
|
||||
registerPassportRoutes(v2)
|
||||
registerUserRoutesV2(v2)
|
||||
registerClientRoutesV2(v2)
|
||||
registerServerRoutesV2(v2)
|
||||
registerAdminRoutesV2(v2)
|
||||
}
|
||||
|
||||
func registerPassportRoutes(group *gin.RouterGroup) {
|
||||
passport := group.Group("/passport")
|
||||
passport.POST("/auth/register", handler.Register)
|
||||
passport.POST("/auth/login", handler.Login)
|
||||
passport.GET("/auth/token2Login", handler.Token2Login)
|
||||
passport.POST("/auth/forget", handler.ForgetPassword)
|
||||
passport.POST("/auth/getQuickLoginUrl", handler.PassportGetQuickLoginURL)
|
||||
passport.POST("/auth/loginWithMailLink", handler.PassportLoginWithMailLink)
|
||||
passport.POST("/comm/sendEmailVerify", handler.SendEmailVerify)
|
||||
passport.POST("/comm/pv", handler.PassportPV)
|
||||
}
|
||||
|
||||
func registerGuestRoutes(v1 *gin.RouterGroup) {
|
||||
guest := v1.Group("/guest")
|
||||
guest.GET("/plan/fetch", handler.GuestPlanFetch)
|
||||
guest.POST("/telegram/webhook", handler.NotImplemented("guest.telegram.webhook"))
|
||||
guest.Any("/payment/notify/:method/:uuid", handler.NotImplemented("guest.payment.notify"))
|
||||
guest.GET("/comm/config", handler.GuestConfig)
|
||||
}
|
||||
|
||||
func registerUserRoutes(v1 *gin.RouterGroup) {
|
||||
user := v1.Group("/user")
|
||||
user.Use(middleware.Auth())
|
||||
user.GET("/resetSecurity", handler.UserResetSecurity)
|
||||
user.GET("/info", handler.UserInfo)
|
||||
user.POST("/changePassword", handler.UserChangePassword)
|
||||
user.POST("/update", handler.UserUpdate)
|
||||
user.GET("/getSubscribe", handler.UserGetSubscribe)
|
||||
user.GET("/getStat", handler.UserGetStat)
|
||||
user.GET("/checkLogin", handler.UserCheckLogin)
|
||||
user.GET("/plan/fetch", handler.GuestPlanFetch)
|
||||
user.GET("/server/fetch", handler.UserServerFetch)
|
||||
user.GET("/comm/config", handler.UserCommConfig)
|
||||
|
||||
user.POST("/transfer", handler.UserTransfer)
|
||||
user.POST("/getQuickLoginUrl", handler.UserGetQuickLoginURL)
|
||||
user.GET("/notice/fetch", handler.UserNoticeFetch)
|
||||
user.POST("/coupon/check", handler.UserCouponCheck)
|
||||
user.POST("/gift-card/check", handler.UserGiftCardCheck)
|
||||
user.POST("/gift-card/redeem", handler.UserGiftCardRedeem)
|
||||
user.GET("/gift-card/history", handler.UserGiftCardHistory)
|
||||
user.GET("/gift-card/detail", handler.UserGiftCardDetail)
|
||||
user.GET("/gift-card/types", handler.UserGiftCardTypes)
|
||||
user.GET("/telegram/getBotInfo", handler.UserTelegramBotInfo)
|
||||
user.POST("/comm/getStripePublicKey", handler.UserGetStripePublicKey)
|
||||
user.GET("/stat/getTrafficLog", handler.UserTrafficLog)
|
||||
user.POST("/order/save", handler.UserOrderSave)
|
||||
user.POST("/order/checkout", handler.UserOrderCheckout)
|
||||
user.GET("/order/check", handler.UserOrderCheck)
|
||||
user.GET("/order/detail", handler.UserOrderDetail)
|
||||
user.GET("/order/fetch", handler.UserOrderFetch)
|
||||
user.GET("/order/getPaymentMethod", handler.UserOrderGetPaymentMethod)
|
||||
user.POST("/order/cancel", handler.UserOrderCancel)
|
||||
user.GET("/invite/save", handler.UserInviteSave)
|
||||
user.GET("/invite/fetch", handler.UserInviteFetch)
|
||||
user.GET("/invite/details", handler.UserInviteDetails)
|
||||
user.GET("/getActiveSession", handler.UserGetActiveSession)
|
||||
user.POST("/removeActiveSession", handler.UserRemoveActiveSession)
|
||||
user.GET("/knowledge/fetch", handler.UserKnowledgeFetch)
|
||||
user.GET("/knowledge/getCategory", handler.UserKnowledgeCategories)
|
||||
user.POST("/ticket/reply", handler.UserTicketReply)
|
||||
user.POST("/ticket/close", handler.UserTicketClose)
|
||||
user.POST("/ticket/save", handler.UserTicketSave)
|
||||
user.GET("/ticket/fetch", handler.UserTicketFetch)
|
||||
user.POST("/ticket/withdraw", handler.UserTicketWithdraw)
|
||||
}
|
||||
|
||||
func registerUserRoutesV2(v2 *gin.RouterGroup) {
|
||||
user := v2.Group("/user")
|
||||
user.Use(middleware.Auth())
|
||||
user.GET("/resetSecurity", handler.UserResetSecurity)
|
||||
user.GET("/info", handler.UserInfo)
|
||||
}
|
||||
|
||||
func registerClientRoutes(v1 *gin.RouterGroup) {
|
||||
client := v1.Group("/client")
|
||||
client.Use(middleware.ClientAuth())
|
||||
client.GET("/subscribe", handler.ClientSubscribe)
|
||||
client.GET("/app/getConfig", handler.ClientAppConfigV1)
|
||||
client.GET("/app/getVersion", handler.ClientAppVersion)
|
||||
}
|
||||
|
||||
func registerClientRoutesV2(v2 *gin.RouterGroup) {
|
||||
client := v2.Group("/client")
|
||||
client.Use(middleware.ClientAuth())
|
||||
client.GET("/app/getConfig", handler.ClientAppConfigV2)
|
||||
client.GET("/app/getVersion", handler.ClientAppVersion)
|
||||
}
|
||||
|
||||
func registerServerRoutesV1(v1 *gin.RouterGroup) {
|
||||
server := v1.Group("/server")
|
||||
|
||||
uniProxy := server.Group("/UniProxy")
|
||||
uniProxy.Use(middleware.NodeAuth())
|
||||
uniProxy.GET("/config", handler.NodeConfig)
|
||||
uniProxy.GET("/user", handler.NodeUser)
|
||||
uniProxy.POST("/push", handler.NodePush)
|
||||
uniProxy.POST("/alive", handler.NodeAlive)
|
||||
uniProxy.GET("/alivelist", handler.NodeAliveList)
|
||||
uniProxy.POST("/status", handler.NodeStatus)
|
||||
|
||||
shadowsocks := server.Group("/ShadowsocksTidalab")
|
||||
shadowsocks.Use(middleware.NodeAuth())
|
||||
shadowsocks.GET("/user", handler.NodeShadowsocksTidalabUser)
|
||||
shadowsocks.POST("/submit", handler.NodeTidalabSubmit)
|
||||
|
||||
trojan := server.Group("/TrojanTidalab")
|
||||
trojan.Use(middleware.NodeAuth())
|
||||
trojan.GET("/config", handler.NodeTrojanTidalabConfig)
|
||||
trojan.GET("/user", handler.NodeTrojanTidalabUser)
|
||||
trojan.POST("/submit", handler.NodeTidalabSubmit)
|
||||
}
|
||||
|
||||
func registerServerRoutesV2(v2 *gin.RouterGroup) {
|
||||
server := v2.Group("/server")
|
||||
server.Use(middleware.NodeAuth())
|
||||
server.POST("/handshake", handler.NodeHandshake)
|
||||
server.POST("/report", handler.NodeReport)
|
||||
server.GET("/config", handler.NodeConfig)
|
||||
server.GET("/user", handler.NodeUser)
|
||||
server.POST("/push", handler.NodePush)
|
||||
server.POST("/alive", handler.NodeAlive)
|
||||
server.GET("/alivelist", handler.NodeAliveList)
|
||||
server.POST("/status", handler.NodeStatus)
|
||||
}
|
||||
|
||||
func registerPluginRoutesV1(v1 *gin.RouterGroup) {
|
||||
securePath := service.GetAdminSecurePath()
|
||||
|
||||
adminPlugins := v1.Group("/" + securePath)
|
||||
adminPlugins.Use(middleware.Auth(), middleware.AdminAuth())
|
||||
adminPlugins.GET("/realname/records", handler.PluginRealNameRecords)
|
||||
adminPlugins.POST("/realname/clear-cache", handler.PluginRealNameClearCache)
|
||||
adminPlugins.POST("/realname/review/:userId", handler.PluginRealNameReview)
|
||||
adminPlugins.POST("/realname/reset/:userId", handler.PluginRealNameReset)
|
||||
adminPlugins.POST("/realname/sync-all", handler.PluginRealNameSyncAll)
|
||||
adminPlugins.POST("/realname/approve-all", handler.PluginRealNameApproveAll)
|
||||
adminPlugins.GET("/user-online-devices/users", handler.PluginUserOnlineDevicesUsers)
|
||||
|
||||
userPlugins := v1.Group("/user")
|
||||
userPlugins.Use(middleware.Auth())
|
||||
userPlugins.GET("/real-name-verification/status", handler.PluginRealNameStatus)
|
||||
userPlugins.POST("/real-name-verification/submit", handler.PluginRealNameSubmit)
|
||||
userPlugins.GET("/user-online-devices/get-ip", handler.PluginUserOnlineDevicesGetIP)
|
||||
userPlugins.POST("/user-add-ipv6-subscription/enable", handler.PluginUserAddIPv6Enable)
|
||||
userPlugins.POST("/user-add-ipv6-subscription/sync-password", handler.PluginUserAddIPv6SyncPassword)
|
||||
userPlugins.GET("/user-add-ipv6-subscription/check", handler.PluginUserAddIPv6Check)
|
||||
}
|
||||
|
||||
func registerAdminRoutesV2(v2 *gin.RouterGroup) {
|
||||
admin := v2.Group("/" + service.GetAdminSecurePath())
|
||||
admin.Use(middleware.Auth(), middleware.AdminAuth())
|
||||
|
||||
admin.GET("/config/fetch", handler.AdminConfigFetch)
|
||||
admin.POST("/config/save", handler.AdminConfigSave)
|
||||
admin.GET("/server/group/fetch", handler.AdminServerGroupsFetch)
|
||||
admin.POST("/server/group/save", handler.AdminServerGroupSave)
|
||||
admin.POST("/server/group/drop", handler.AdminServerGroupDrop)
|
||||
admin.GET("/server/route/fetch", handler.AdminServerRoutesFetch)
|
||||
admin.POST("/server/route/save", handler.AdminServerRouteSave)
|
||||
admin.POST("/server/route/drop", handler.AdminServerRouteDrop)
|
||||
admin.GET("/server/manage/getNodes", handler.AdminServerManageGetNodes)
|
||||
admin.POST("/server/manage/sort", handler.AdminServerManageSort)
|
||||
admin.POST("/server/manage/update", handler.AdminServerManageUpdate)
|
||||
admin.POST("/server/manage/save", handler.AdminServerManageSave)
|
||||
admin.POST("/server/manage/drop", handler.AdminServerManageDrop)
|
||||
admin.POST("/server/manage/copy", handler.AdminServerManageCopy)
|
||||
admin.POST("/server/manage/batchDelete", handler.AdminServerManageBatchDelete)
|
||||
admin.POST("/server/manage/resetTraffic", handler.AdminServerManageResetTraffic)
|
||||
admin.POST("/server/manage/batchResetTraffic", handler.AdminServerManageBatchResetTraffic)
|
||||
admin.GET("/system/getSystemStatus", handler.AdminSystemStatus)
|
||||
admin.GET("/plugin/getPlugins", handler.AdminPluginsList)
|
||||
admin.GET("/plugin/types", handler.AdminPluginTypes)
|
||||
admin.GET("/plugin/integration-status", handler.AdminPluginIntegrationStatus)
|
||||
}
|
||||
|
||||
func registerWebRoutes(router *gin.Engine) {
|
||||
themeRoot := filepath.Join(".", "frontend", "theme")
|
||||
adminRoot := filepath.Join(".", "frontend", "admin")
|
||||
|
||||
if _, err := os.Stat(themeRoot); err == nil {
|
||||
router.Static("/theme", themeRoot)
|
||||
}
|
||||
if _, err := os.Stat(adminRoot); err == nil {
|
||||
router.Static("/admin-assets", adminRoot)
|
||||
}
|
||||
|
||||
securePath := "/" + service.GetAdminSecurePath()
|
||||
router.GET("/", handler.UserThemePage)
|
||||
router.GET("/dashboard", handler.UserThemePage)
|
||||
router.GET(securePath, handler.AdminAppPage)
|
||||
router.GET(securePath+"/", handler.AdminAppPage)
|
||||
router.GET(securePath+"/plugins/:plugin", handler.AdminAppPage)
|
||||
}
|
||||
Reference in New Issue
Block a user