package handlers import ( "context" "net/http" "github.com/a-h/templ/examples/counter/components" "github.com/a-h/templ/examples/counter/services" "github.com/a-h/templ/examples/counter/session" "golang.org/x/exp/slog" ) type CountService interface { Increment(ctx context.Context, it services.IncrementType, sessionID string) (counts services.Counts, err error) Get(ctx context.Context, sessionID string) (counts services.Counts, err error) } func New(log *slog.Logger, cs CountService) *DefaultHandler { return &DefaultHandler{ Log: log, CountService: cs, } } type DefaultHandler struct { Log *slog.Logger CountService CountService } func (h *DefaultHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodPost { h.Post(w, r) return } h.Get(w, r) } func (h *DefaultHandler) Get(w http.ResponseWriter, r *http.Request) { var props ViewProps var err error props.Counts, err = h.CountService.Get(r.Context(), session.ID(r)) if err != nil { h.Log.Error("failed to get counts", slog.Any("error", err)) http.Error(w, "failed to get counts", http.StatusInternalServerError) return } h.View(w, r, props) } func (h *DefaultHandler) Post(w http.ResponseWriter, r *http.Request) { r.ParseForm() // Decide the action to take based on the button that was pressed. var it services.IncrementType if r.Form.Has("global") { it = services.IncrementTypeGlobal } if r.Form.Has("session") { it = services.IncrementTypeSession } counts, err := h.CountService.Increment(r.Context(), it, session.ID(r)) if err != nil { h.Log.Error("failed to increment", slog.Any("error", err)) http.Error(w, "failed to increment", http.StatusInternalServerError) return } // Display the view. h.View(w, r, ViewProps{ Counts: counts, }) } type ViewProps struct { Counts services.Counts } func (h *DefaultHandler) View(w http.ResponseWriter, r *http.Request, props ViewProps) { components.Page(props.Counts.Global, props.Counts.Session).Render(r.Context(), w) }