dana-medical-site/internal/api/handlers_site.go
2026-10-14 13:33:13 +00:00

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)
}