P1: GET /v1/search без фильтров — отдавать топы календарей и событий #50
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
GET /v1/searchбез фильтров сейчас возвращает все доступные пользователю календари и события (полный скан Mnesia + пагинация). Для страницы «Найти» нужен осмысленный дефолт — топы изstats_tops, а не полный каталог.На фронте (#7) при открытии
/searchпланируется вызывать search без параметров; без изменения бэка пользователь либо получит слишком большой/случайный список, либо фронт вынужден держать отдельную логику.Влияние
Ожидаемый результат
При пустых query-параметрах поиска (
q,tags, geo,from/toотсутствуют;type—undefinedили явно задан)GET /v1/searchвозвращает топовые публичные календари и события из агрегатовstats_tops, с учётом прав доступа пользователя.При непустых фильтрах поведение без изменений — текущий полнотекстовый поиск и фильтрация.
Контракт ответа тот же:
{ total, limit, offset, results }(events/calendars).Критерии приёмки
GET /v1/search(только auth) → топ-календари + топ-события (лимит поlimit, default 20).type=calendar/type=eventбезq→ топ соответствующего типа.q, тегами, датами или geo — старая логика search, не топы.can_access, что вlogic_search.core_calendar:get_top_calendars_by_rating/1(или by_reviews — зафиксировать в PR) иcore_event:get_top_events_by_rating/1; fallback при пустых tops — документировать (пустой список или текущий scan).logic_search_tests.erlна ветку «empty params → tops» и на то, чтоqпереключает на обычный search.EventHubBackSpec.md§ search после тестов.Файлы (подсказка)
src/logic/logic_search.erlsrc/handlers/handler_search.erlsrc/core/core_calendar.erl,src/core/core_event.erlsrc/infra/stats_tops.erltest/unit/logic_search_tests.erlСвязанные задачи
Приоритет
P1
Беру в работу. Сначала предложу варианты реализации discovery-топов в GET /v1/search.
Реализован вариант 1 + fallback (локально, без push): пустой GET /v1/search → tops by rating из stats_tops с can_access; при пустых tops — scan. q/tags/geo/from/to/sort → прежний поиск. Unit: logic_search_tests (+2 кейса), 13/13 ok.
Готово. Коммит
6d52bc3: пустойGET /v1/search(безq, тегов, дат, geo, sort) отдаёт discovery tops изstats_topsс фильтромcan_accessи fallback на полный scan; приq/фильтрах — прежний поиск. Unitlogic_search_tests(13/13).CI run 366 — зелёный (IFT e2e, 39/39 API).
Спека обновлена:
EventHubBackSpec.mdВ§2.5,EventHubFrontSpec.mdВ§5.3.