You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.1 KiB
Go

package handler
import (
"log/slog"
"net/http"
"strings"
"github.com/go-chi/chi/v5"
"github.com/denisovdennis/autohero/internal/world"
)
type MapsHandler struct {
world *world.Service
logger *slog.Logger
}
func NewMapsHandler(worldSvc *world.Service, logger *slog.Logger) *MapsHandler {
return &MapsHandler{
world: worldSvc,
logger: logger,
}
}
// GetMap returns a deterministic server map with ETag support.
// GET /api/v1/maps/{mapId}
func (h *MapsHandler) GetMap(w http.ResponseWriter, r *http.Request) {
mapID := chi.URLParam(r, "mapId")
if strings.TrimSpace(mapID) == "" {
writeJSON(w, http.StatusBadRequest, map[string]string{
"error": "missing mapId",
})
return
}
serverMap, etag, ok := h.world.GetMap(mapID)
if !ok {
writeJSON(w, http.StatusNotFound, map[string]string{
"error": "map not found",
})
return
}
ifNoneMatch := strings.TrimSpace(r.Header.Get("If-None-Match"))
if ifNoneMatch != "" && ifNoneMatch == etag {
w.Header().Set("ETag", etag)
w.WriteHeader(http.StatusNotModified)
return
}
w.Header().Set("ETag", etag)
writeJSON(w, http.StatusOK, serverMap)
}