package main import ( "context" "errors" "flag" "fmt" "log/slog" "net/http" "os" "os/signal" "syscall" "forge.capytal.company/capytalcode/project-comicverse/lib/middleware" "forge.capytal.company/capytalcode/project-comicverse/lib/router" "keikos.work/assets" "keikos.work/configs" "keikos.work/handlers/pages" ) var ( port int64 = 8080 dev bool = false ) func init() { flag.Int64Var(&port, "port", port, "The website port") flag.BoolVar(&dev, "dev", dev, "Run the website in development mode") } func main() { flag.Parse() l := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ Level: slog.LevelDebug, })) if dev { l.Info("RUNNING IN DEVELOPMENT MODE") configs.DEVELOPMENT = true } r := router.NewRouter() r.Use(middleware.NewLoggerMiddleware(l).Wrap) if configs.DEVELOPMENT { r.Use(middleware.DevMiddleware) r.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets")))) } else { r.Use(middleware.CacheMiddleware) r.Handle("/assets/", http.StripPrefix("/assets/", http.FileServerFS(assets.ASSETS))) } r.Handle("/", pages.Routes()) srv := http.Server{ Addr: fmt.Sprintf(":%d", port), Handler: r, } ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() go func() { if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { l.Error("Listen and serve returned error", slog.String("error", err.Error())) } }() <-ctx.Done() l.Info("Shutting down server...") if err := srv.Shutdown(context.Background()); err != nil { l.Error("Server shutdown returned error", slog.String("error", err.Error())) } l.Info("FINAL") }