learnlytics-go/templ/examples/counter/handlers/default.go

82 lines
2.0 KiB
Go
Raw Normal View History

2025-03-20 12:35:13 +01:00
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)
}