package api import ( "net/http" "strings" "unicode/utf8" ) func (a *API) banners(w http.ResponseWriter, r *http.Request) { list, err := a.store.Banners(r.Context(), r.URL.Query().Get("position")) if err != nil { handleErr(w, err) return } ok(w, list, map[string]any{"total": len(list)}) } var searchTypes = map[string]bool{"services": true, "doctors": true, "prices": true, "checkups": true} // search: ?q=текст&types=services,doctors&limit=5 // Один эндпоинт обслуживает и поиск в шапке, и «Поиск услуг» / «Поиск специалиста» // в блоках главной — там передаётся нужный types. func (a *API) search(w http.ResponseWriter, r *http.Request) { q := strings.TrimSpace(r.URL.Query().Get("q")) if utf8.RuneCountInString(q) < 2 { fail(w, http.StatusBadRequest, "query_too_short", "Введите минимум 2 символа") return } if utf8.RuneCountInString(q) > 100 { fail(w, http.StatusBadRequest, "query_too_long", "Слишком длинный запрос") return } types := map[string]bool{} if raw := r.URL.Query().Get("types"); raw != "" { for _, t := range strings.Split(raw, ",") { t = strings.TrimSpace(t) if !searchTypes[t] { fail(w, http.StatusBadRequest, "bad_type", "Неизвестный тип поиска: "+t) return } types[t] = true } } limit := queryInt(r, "limit", 5) if limit <= 0 || limit > 50 { limit = 5 } res, err := a.store.Search(r.Context(), q, types, limit) if err != nil { handleErr(w, err) return } ok(w, res, nil) }