66 lines
1.9 KiB
Go
66 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"cloudnest/internal/bootstrap"
|
|
"cloudnest/internal/config"
|
|
"cloudnest/internal/di"
|
|
"cloudnest/internal/pkg/logger"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func main() {
|
|
// Step 1: Initialize logger FIRST to prevent nil pointer panics
|
|
// 第一步:先初始化日志记录器以防止空指针 panic
|
|
logger.Init("info")
|
|
|
|
// Step 2: Load configuration
|
|
// 第二步:加载配置
|
|
cfg := config.Load()
|
|
|
|
// Step 3: Re-initialize logger with the configured log level
|
|
// 第三步:使用配置的日志级别重新初始化日志记录器
|
|
logger.Init(cfg.App.LogLevel)
|
|
|
|
// Step 4: Initialize services
|
|
// 第四步:初始化服务
|
|
c := di.New()
|
|
if err := c.InitializeServices(); err != nil {
|
|
logger.Fatal("failed to initialize services", "error", err)
|
|
}
|
|
|
|
// Step 5: Build the HTTP engine (auth service only registers auth routes)
|
|
// 第五步:构建 HTTP 引擎(认证服务只注册认证路由)
|
|
engine, err := c.BuildAuthEngine()
|
|
if err != nil {
|
|
logger.Fatal("failed to build engine", "error", err)
|
|
}
|
|
|
|
setupStaticFiles(engine)
|
|
|
|
// Step 6: Create server with lifecycle management
|
|
// 第六步:创建带生命周期管理的服务器
|
|
srv := bootstrap.NewServer(cfg, engine)
|
|
if err := srv.Run(); err != nil {
|
|
if err == bootstrap.ErrReloadRequested {
|
|
logger.Info("exiting for reload, supervisor should restart")
|
|
} else {
|
|
logger.Error("server exited with error", "error", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func setupStaticFiles(engine *gin.Engine) {
|
|
engine.GET("/", func(c *gin.Context) { serveHTML(c, "web/index.html") })
|
|
engine.GET("/login", func(c *gin.Context) { serveHTML(c, "web/login.html") })
|
|
engine.GET("/register", func(c *gin.Context) { serveHTML(c, "web/register.html") })
|
|
engine.NoRoute(func(c *gin.Context) {
|
|
if c.Request.Method == http.MethodGet {
|
|
serveHTML(c, "web/index.html")
|
|
} else {
|
|
c.JSON(http.StatusNotFound, gin.H{"code": 404, "message": "not found"})
|
|
}
|
|
})
|
|
}
|