package initialize import ( "context" "fmt" "net/http" "os" "os/signal" "syscall" "time" "github.com/dungnt11/senflow_app/global" "github.com/dungnt11/senflow_app/internal/routers" "github.com/dungnt11/senflow_app/internal/wire" "github.com/gin-gonic/gin" "go.uber.org/zap" ) // Run khởi động ứng dụng func Run() { // Tải cấu hình từ file .env if err := LoadConfig(); err != nil { fmt.Printf("Không thể tải cấu hình: %s\n", err.Error()) return } // Khởi tạo logger global.Logger = InitLogger() if global.Logger == nil { fmt.Println("Khởi tạo logger thất bại") return } // Khởi tạo database global.Mdb = InitMysql() if global.Mdb == nil { global.Logger.Error("Khởi tạo MySQL thất bại") return } // Khởi tạo router r := provideRouter() // Khởi tạo controllers thông qua wire controllers, err := wire.InitializeControllers() if err != nil { global.Logger.Error("Khởi tạo controllers thất bại", zap.Error(err)) return } // Khởi tạo routers routers.InitRouters(r, controllers) // Khởi động server port := global.Config.Server.Port server := &http.Server{ Addr: fmt.Sprintf(":%s", port), Handler: r, } // Khởi động server trong goroutine riêng go func() { global.Logger.Info(fmt.Sprintf("Server đang chạy trên cổng %s", port)) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { global.Logger.Error("Server gặp lỗi", zap.Error(err)) } }() // Graceful shutdown quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit global.Logger.Info("Đang tắt server...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { global.Logger.Error("Server shutdown gặp lỗi", zap.Error(err)) } global.Logger.Info("Server đã tắt thành công.") } func provideRouter() *gin.Engine { if global.Config.Server.AppEnv == "local" { gin.SetMode(gin.DebugMode) gin.ForceConsoleColor() return gin.Default() } else { gin.SetMode(gin.ReleaseMode) return gin.New() } }