package httpapi import ( "log/slog" "net/http" "strings" "github.com/mitbringsl/backend/internal/store" ) // SuggestHandler handles the /api/suggestions endpoint. type SuggestHandler struct { suggest *store.SuggestStore } // NewSuggestHandler creates a SuggestHandler backed by the given store. func NewSuggestHandler(suggest *store.SuggestStore) *SuggestHandler { return &SuggestHandler{suggest: suggest} } type suggestResponse struct { Suggestions []string `json:"suggestions"` } // Search returns autocomplete suggestions for item names matching the query. // // GET /api/suggestions?q= func (h *SuggestHandler) Search(w http.ResponseWriter, r *http.Request) { q := strings.TrimSpace(r.URL.Query().Get("q")) if q == "" { renderError(w, http.StatusBadRequest, "Bad request", "Query parameter 'q' is required.") return } // Lowercase so the trgm index can match correctly. q = strings.ToLower(q) names, err := h.suggest.Search(r.Context(), q) if err != nil { slog.Error("suggest search failed", "error", err, "q", q) renderError(w, http.StatusInternalServerError, "Internal error", "Could not load suggestions.") return } if names == nil { names = []string{} } renderJSON(w, http.StatusOK, suggestResponse{Suggestions: names}) }