diff --git a/apps/emqx_management/src/emqx_mgmt_api_routes.erl b/apps/emqx_management/src/emqx_mgmt_api_routes.erl index 19f42427e..870f66892 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_routes.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_routes.erl @@ -26,8 +26,12 @@ -export([ routes/2 , route/2]). +-export([query/4]). + -define(TOPIC_NOT_FOUND, 'TOPIC_NOT_FOUND'). +-define(ROUTES_QS_SCHEMA, [{<<"topic">>, binary}, {<<"node">>, atom}]). + -import(emqx_mgmt_util, [ object_schema/2 , object_array_schema/2 , error_schema/2 @@ -48,7 +52,7 @@ routes_api() -> Metadata = #{ get => #{ description => <<"EMQ X routes">>, - parameters => page_params(), + parameters => [topic_param(query) , node_param()] ++ page_params(), responses => #{ <<"200">> => object_array_schema(properties(), <<"List route info">>) } @@ -60,13 +64,7 @@ route_api() -> Metadata = #{ get => #{ description => <<"EMQ X routes">>, - parameters => [#{ - name => topic, - in => path, - required => true, - description => <<"Topic string, url encoding">>, - schema => #{type => string} - }], + parameters => [topic_param(path)], responses => #{ <<"200">> => object_schema(properties(), <<"Route info">>), @@ -80,15 +78,15 @@ route_api() -> %%%============================================================================================== %% parameters trans routes(get, #{query_string := Qs}) -> - list(Qs). + list(generate_topic(Qs)). route(get, #{bindings := Bindings}) -> - lookup(Bindings). + lookup(generate_topic(Bindings)). %%%============================================================================================== %% api apply list(Params) -> - Response = emqx_mgmt_api:paginate(emqx_route, Params, fun format/1), + Response = emqx_mgmt_api:node_query(node(), Params, emqx_route, ?ROUTES_QS_SCHEMA, {?MODULE, query}), {200, Response}. lookup(#{topic := Topic}) -> @@ -101,7 +99,41 @@ lookup(#{topic := Topic}) -> %%%============================================================================================== %% internal +generate_topic(Params = #{<<"topic">> := Topic}) -> + Params#{<<"topic">> => uri_string:percent_decode(Topic)}; +generate_topic(Params = #{topic := Topic}) -> + Params#{topic => uri_string:percent_decode(Topic)}; +generate_topic(Params) -> Params. + +query(Tab, {Qs, _}, Start, Limit) -> + Ms = qs2ms(Qs, [{{route, '_', '_'}, [], ['$_']}]), + emqx_mgmt_api:select_table(Tab, Ms, Start, Limit, fun format/1). + +qs2ms([], Res) -> Res; +qs2ms([{topic,'=:=', T} | Qs], [{{route, _, N}, [], ['$_']}]) -> + qs2ms(Qs, [{{route, T, N}, [], ['$_']}]); +qs2ms([{node,'=:=', N} | Qs], [{{route, T, _}, [], ['$_']}]) -> + qs2ms(Qs, [{{route, T, N}, [], ['$_']}]). + format(#route{topic = Topic, dest = {_, Node}}) -> #{topic => Topic, node => Node}; format(#route{topic = Topic, dest = Node}) -> #{topic => Topic, node => Node}. + +topic_param(In) -> + #{ + name => topic, + in => In, + required => In == path, + description => <<"Topic string, url encoding">>, + schema => #{type => string} + }. + +node_param()-> + #{ + name => node, + in => query, + required => false, + description => <<"Node">>, + schema => #{type => string} + }.