package web import ( "context" "fmt" "html/template" "io/fs" "net/http" "github.com/rjNemo/payit/config" "github.com/rjNemo/payit/internal/payments" "github.com/rjNemo/payit/internal/payments/driver/stripe" "github.com/rjNemo/payit/internal/payments/service" webassets "github.com/rjNemo/payit/web" ) type checkoutService interface { CreateSession(context.Context, payments.CheckoutSessionRequest) (payments.CheckoutSessionResult, error) } // Handler aggregates dependencies required by HTTP handlers. type Handler struct { cfg config.Config checkout checkoutService page *template.Template } // NewServer constructs the root HTTP handler, wiring Stripe-backed endpoints as they are implemented. func NewServer(cfg config.Config) http.Handler { driver := stripe.NewDriver(cfg.StripeSecretKey, cfg.Product) checkoutSvc := service.NewCheckoutService(driver) tmpl := template.Must(template.ParseFS(webassets.Assets, "templates/index.html")) staticFS, err := fs.Sub(webassets.Assets, "static") if err != nil { panic(fmt.Errorf("failed to load static assets: %w", err)) } h := &Handler{cfg: cfg, checkout: checkoutSvc, page: tmpl} mux := http.NewServeMux() mux.HandleFunc("POST /api/checkout", h.createCheckoutSession) mux.Handle("GET /", http.HandlerFunc(h.renderCheckoutPage)) mux.Handle("GET /static/", http.StripPrefix("/static/", http.FileServer(http.FS(staticFS)))) return mux }