package main import ( "context" "net/http" "os" "os/signal" "syscall" "time" "git.okseby.com/okseby/playground-go/handlers" "git.okseby.com/okseby/playground-go/internal/config" "git.okseby.com/okseby/playground-go/logger" "git.okseby.com/okseby/playground-go/middleware" ) func main() { // Load config config.Load() // Register routes mux := handlers.RegisterRoutes() handler := middleware.Logger(mux) server := &http.Server{ Addr: ":" + config.AppConfig.Port, Handler: handler, } // Channel to listen for shutdown signals quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // Run the server in a goroutine go func() { logger.Info("Starting server on port %s...", config.AppConfig.Port) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { logger.Fatal("Error starting server: %v", err) } }() // Wait for shutdown signal <-quit logger.Info("Shutting down...") ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { logger.Fatal("Server forced to shutdown: %v", err) } logger.Info("Server exited cleanly.") }