From fc38f63497afd54d557bacec21b6dd10247e2e6e Mon Sep 17 00:00:00 2001 From: Aleksey Sabilin Date: Mon, 20 Jul 2026 14:04:56 +0300 Subject: [PATCH] fix: only add search filters present in QS so empty GET hits discovery tops. Refs EventHub/EventHubBack#50 --- src/handlers/handler_search.erl | 44 ++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/handlers/handler_search.erl b/src/handlers/handler_search.erl index 022a6ce..4e86691 100644 --- a/src/handlers/handler_search.erl +++ b/src/handlers/handler_search.erl @@ -101,28 +101,42 @@ search(Req) -> %%%=================================================================== %% @private Собирает карту параметров для поискового движка. +%% Не кладёт sort/tags/geo/даты, если их нет в QS — иначе +%% logic_search:is_discovery_request/2 никогда не сработает (Back#50). -spec parse_params(cowboy_req:qs()) -> map(). parse_params(Qs) -> - Params = #{ + Params0 = #{ limit => parse_int_param(Qs, <<"limit">>, 20), - offset => parse_int_param(Qs, <<"offset">>, 0), - tags => proplists:get_value(<<"tags">>, Qs), - sort => proplists:get_value(<<"sort">>, Qs, <<"start_time">>), - order => proplists:get_value(<<"order">>, Qs, <<"asc">>) + offset => parse_int_param(Qs, <<"offset">>, 0) }, - Params1 = case {parse_float_param(Qs, <<"lat">>), parse_float_param(Qs, <<"lon">>)} of + Params1 = case proplists:get_value(<<"tags">>, Qs) of + undefined -> Params0; + <<>> -> Params0; + Tags -> Params0#{tags => Tags} + end, + Params2 = case proplists:get_value(<<"sort">>, Qs) of + undefined -> Params1; + <<>> -> Params1; + Sort -> + Order = case proplists:get_value(<<"order">>, Qs) of + undefined -> <<"asc">>; + <<>> -> <<"asc">>; + O -> O + end, + Params1#{sort => Sort, order => Order} + end, + Params3 = case {parse_float_param(Qs, <<"lat">>), parse_float_param(Qs, <<"lon">>)} of {{ok, Lat}, {ok, Lon}} -> Radius = parse_int_param(Qs, <<"radius">>, 10), - Params#{lat => Lat, lon => Lon, radius => Radius}; - _ -> Params + Params2#{lat => Lat, lon => Lon, radius => Radius}; + _ -> Params2 end, - Params2 = case {parse_datetime_param(Qs, <<"from">>), parse_datetime_param(Qs, <<"to">>)} of - {{ok, From}, {ok, To}} -> Params1#{from => From, to => To}; - {{ok, From}, error} -> Params1#{from => From}; - {error, {ok, To}} -> Params1#{to => To}; - _ -> Params1 - end, - Params2. + case {parse_datetime_param(Qs, <<"from">>), parse_datetime_param(Qs, <<"to">>)} of + {{ok, From}, {ok, To}} -> Params3#{from => From, to => To}; + {{ok, From}, error} -> Params3#{from => From}; + {error, {ok, To}} -> Params3#{to => To}; + _ -> Params3 + end. -spec parse_int_param(cowboy_req:qs(), binary(), integer()) -> integer(). parse_int_param(Qs, Key, Default) ->