package greet import ( "context" "encoding/json" "net/http" "github.com/go-chi/chi/v5" "github.com/rs/zerolog/log" ) type Greeter interface { Greet(ctx context.Context, 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) { log.Trace().Msg("Registering greet routes") router.Get("/", h.handleGreetQuery) router.Get("/{name}", h.handleGreetPath) log.Trace().Msg("Greet routes registered") } func (h *apiV1GreetHandler) handleGreetQuery(w http.ResponseWriter, r *http.Request) { name := r.URL.Query().Get("name") h.writeJSONResponse(w, h.greeter.Greet(r.Context(), name)) } func (h *apiV1GreetHandler) handleGreetPath(w http.ResponseWriter, r *http.Request) { name := chi.URLParam(r, "name") h.writeJSONResponse(w, h.greeter.Greet(r.Context(), 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}) }