58 lines
1.6 KiB
Go
58 lines
1.6 KiB
Go
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)
|
|
}
|