package main import ( "context" "fmt" "net/http" "os" "os/signal" "syscall" "time" middleware "synlotto-website/internal/http/middleware" "synlotto-website/internal/platform/config" "synlotto-website/internal/platform/csrf" "synlotto-website/internal/platform/session" "github.com/gin-gonic/gin" ) func main() { cfg, err := config.Load("config.json") if err != nil { panic(fmt.Errorf("load config: %w", err)) } sessions := session.New(cfg) router := gin.New() router.Use(gin.Logger(), gin.Recovery()) router.Use(middleware.Session(sessions)) router.GET("/healthz", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"status": "ok"}) }) handler := csrf.Wrap(router, cfg) addr := fmt.Sprintf("%s:%d", cfg.HttpServer.Address, cfg.HttpServer.Port) srv := &http.Server{ Addr: addr, Handler: handler, ReadHeaderTimeout: 10 * time.Second, } go func() { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { panic(err) } }() fmt.Printf("Server running on http://%s\n", addr) stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt, syscall.SIGTERM) <-stop fmt.Println("Shutting down...") ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() _ = srv.Shutdown(ctx) }