82 lines
2.0 KiB
Go
82 lines
2.0 KiB
Go
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)
|
|
}
|