package main import ( "context" "log" "net/http" "os/signal" "syscall" "time" "bookra/apps/backend/internal/api" "bookra/apps/backend/internal/config" "bookra/apps/backend/internal/db" ) func main() { cfg, err := config.Load() if err != nil { log.Fatalf("load config: %v", err) } pools, err := db.NewPools(cfg) if err != nil { log.Fatalf("create database pools: %v", err) } defer pools.Close() server, err := api.NewServer(cfg, pools) if err != nil { log.Fatalf("create server: %v", err) } httpServer := &http.Server{ Addr: ":" + cfg.Port, Handler: server.Handler(), ReadHeaderTimeout: 5 * time.Second, } go func() { log.Printf("bookra api listening on :%s (%s)", cfg.Port, cfg.Environment) if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen: %v", err) } }() ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT) defer stop() <-ctx.Done() shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := httpServer.Shutdown(shutdownCtx); err != nil { log.Printf("shutdown error: %v", err) } }