package greet import ( "encoding/json" "net/http" "github.com/go-chi/chi/v5" ) type Greeter interface { Greet(name string) string } type ApiV1Greet interface { RegisterRoutes(router chi.Router) } type apiV1GreetHandler struct { greeter Greeter } func NewApiV1GreetHandler(greeter Greeter) ApiV1Greet { return &apiV1GreetHandler{greeter: greeter} } func (h *apiV1GreetHandler) RegisterRoutes(router chi.Router) { router.Get("/", h.handleGreetQuery) router.Get("/{name}", h.handleGreetPath) } func (h *apiV1GreetHandler) handleGreetQuery(w http.ResponseWriter, r *http.Request) { name := r.URL.Query().Get("name") h.writeJSONResponse(w, h.greeter.Greet(name)) } func (h *apiV1GreetHandler) handleGreetPath(w http.ResponseWriter, r *http.Request) { name := chi.URLParam(r, "name") h.writeJSONResponse(w, h.greeter.Greet(name)) } func (h *apiV1GreetHandler) writeJSONResponse(w http.ResponseWriter, message string) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string]string{"message": message}) }