Przeglądaj źródła

fix: routes api add params (#5675)

* fix: routes api add topic query params

* fix: routes api add node query params
DDDHuang 4 lat temu
rodzic
commit
8b2488e099
1 zmienionych plików z 43 dodań i 11 usunięć
  1. 43 11
      apps/emqx_management/src/emqx_mgmt_api_routes.erl

+ 43 - 11
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}
+    }.