package server import ( "crypto/tls" "database/sql" "fmt" "net/http" "time" "github.com/go-chi/chi/v5" ) type Config struct { Addr string TLSCert string TLSKey string DB *sql.DB BaseURL string } // Start creates and starts the REST API server. It returns the *http.Server // so the caller can manage graceful shutdown. The server runs in a background // goroutine. func Start(cfg Config) (*http.Server, error) { r := chi.NewRouter() RegisterRoutes(r, cfg.DB, cfg.BaseURL) tlsCert, err := tls.LoadX509KeyPair(cfg.TLSCert, cfg.TLSKey) if err != nil { return nil, fmt.Errorf("load TLS cert: %w", err) } srv := &http.Server{ Addr: cfg.Addr, Handler: r, TLSConfig: &tls.Config{ Certificates: []tls.Certificate{tlsCert}, MinVersion: tls.VersionTLS13, }, ReadTimeout: 30 * time.Second, WriteTimeout: 30 * time.Second, IdleTimeout: 120 * time.Second, } fmt.Printf("REST API listening on %s\n", cfg.Addr) go func() { _ = srv.ListenAndServeTLS("", "") }() return srv, nil }