Pārlūkot izejas kodu

fix: bad auto_subscribe api schema

Zhongwen Deng 3 gadi atpakaļ
vecāks
revīzija
5415e341fb

+ 15 - 18
apps/emqx_auto_subscribe/src/emqx_auto_subscribe.erl

@@ -51,8 +51,21 @@ max_limit() ->
 list() ->
     format(emqx_conf:get([auto_subscribe, topics], [])).
 
-update(Topics) ->
-    update_(Topics).
+update(Topics) when length(Topics) =< ?MAX_AUTO_SUBSCRIBE ->
+    case
+        emqx_conf:update(
+            [auto_subscribe, topics],
+            Topics,
+            #{rawconf_with_defaults => true, override_to => cluster}
+        )
+    of
+        {ok, #{raw_config := NewTopics}} ->
+            {ok, NewTopics};
+        {error, Reason} ->
+            {error, Reason}
+    end;
+update(_Topics) ->
+    {error, quota_exceeded}.
 
 post_config_update(_KeyPath, _Req, NewTopics, _OldConf, _AppEnvs) ->
     Config = emqx_conf:get([auto_subscribe], #{}),
@@ -95,22 +108,6 @@ format(Rule = #{topic := Topic}) when is_map(Rule) ->
         nl => maps:get(nl, Rule, 0)
     }.
 
-update_(Topics) when length(Topics) =< ?MAX_AUTO_SUBSCRIBE ->
-    case
-        emqx_conf:update(
-            [auto_subscribe, topics],
-            Topics,
-            #{rawconf_with_defaults => true, override_to => cluster}
-        )
-    of
-        {ok, #{raw_config := NewTopics}} ->
-            {ok, NewTopics};
-        {error, Reason} ->
-            {error, Reason}
-    end;
-update_(_Topics) ->
-    {error, quota_exceeded}.
-
 update_hook() ->
     update_hook(emqx_conf:get([auto_subscribe], #{})).
 

+ 11 - 8
apps/emqx_auto_subscribe/src/emqx_auto_subscribe_api.erl

@@ -34,7 +34,7 @@
 -include_lib("emqx/include/emqx_placeholder.hrl").
 
 api_spec() ->
-    emqx_dashboard_swagger:spec(?MODULE).
+    emqx_dashboard_swagger:spec(?MODULE, #{check_schema => true}).
 
 paths() ->
     ["/mqtt/auto_subscribe"].
@@ -46,15 +46,15 @@ schema("/mqtt/auto_subscribe") ->
             description => ?DESC(list_auto_subscribe_api),
             tags => [<<"Auto Subscribe">>],
             responses => #{
-                200 => hoconsc:ref(emqx_auto_subscribe_schema, "auto_subscribe")
+                200 => topics()
             }
         },
         put => #{
             description => ?DESC(update_auto_subscribe_api),
             tags => [<<"Auto Subscribe">>],
-            'requestBody' => hoconsc:ref(emqx_auto_subscribe_schema, "auto_subscribe"),
+            'requestBody' => topics(),
             responses => #{
-                200 => hoconsc:ref(emqx_auto_subscribe_schema, "auto_subscribe"),
+                200 => topics(),
                 409 => emqx_dashboard_swagger:error_codes(
                     [?EXCEED_LIMIT],
                     ?DESC(update_auto_subscribe_api_response409)
@@ -63,14 +63,17 @@ schema("/mqtt/auto_subscribe") ->
         }
     }.
 
+topics() ->
+    Fields = emqx_auto_subscribe_schema:fields("auto_subscribe"),
+    {topics, Topics} = lists:keyfind(topics, 1, Fields),
+    Topics.
+
 %%%==============================================================================================
 %% api apply
 auto_subscribe(get, _) ->
     {200, emqx_auto_subscribe:list()};
-auto_subscribe(put, #{body := #{}}) ->
-    {400, #{code => ?BAD_REQUEST, message => <<"Request body required">>}};
-auto_subscribe(put, #{body := Params}) ->
-    case emqx_auto_subscribe:update(Params) of
+auto_subscribe(put, #{body := Topics}) when is_list(Topics) ->
+    case emqx_auto_subscribe:update(Topics) of
         {error, quota_exceeded} ->
             Message = list_to_binary(
                 io_lib:format(

+ 26 - 0
apps/emqx_auto_subscribe/test/emqx_auto_subscribe_SUITE.erl

@@ -151,6 +151,32 @@ t_update(_) ->
     ResponseMap = emqx_json:decode(Response, [return_maps]),
     ?assertEqual(1, erlang:length(ResponseMap)),
 
+    BadBody1 = #{topic => ?TOPIC_S},
+    ?assertMatch(
+        {error, {"HTTP/1.1", 400, "Bad Request"}},
+        emqx_mgmt_api_test_util:request_api(put, Path, "", Auth, BadBody1)
+    ),
+    BadBody2 = [#{topic => ?TOPIC_S, qos => 3}],
+    ?assertMatch(
+        {error, {"HTTP/1.1", 400, "Bad Request"}},
+        emqx_mgmt_api_test_util:request_api(put, Path, "", Auth, BadBody2)
+    ),
+    BadBody3 = [#{topic => ?TOPIC_S, rh => 10}],
+    ?assertMatch(
+        {error, {"HTTP/1.1", 400, "Bad Request"}},
+        emqx_mgmt_api_test_util:request_api(put, Path, "", Auth, BadBody3)
+    ),
+    BadBody4 = [#{topic => ?TOPIC_S, rap => -1}],
+    ?assertMatch(
+        {error, {"HTTP/1.1", 400, "Bad Request"}},
+        emqx_mgmt_api_test_util:request_api(put, Path, "", Auth, BadBody4)
+    ),
+    BadBody5 = [#{topic => ?TOPIC_S, nl => -1}],
+    ?assertMatch(
+        {error, {"HTTP/1.1", 400, "Bad Request"}},
+        emqx_mgmt_api_test_util:request_api(put, Path, "", Auth, BadBody5)
+    ),
+
     {ok, Client} = emqtt:start_link(#{username => ?CLIENT_USERNAME, clientid => ?CLIENT_ID}),
     {ok, _} = emqtt:connect(Client),
     timer:sleep(100),

+ 1 - 1
apps/emqx_dashboard/src/emqx_dashboard_swagger.erl

@@ -705,7 +705,7 @@ typename_to_spec("service_account_json()", _Mod) ->
 typename_to_spec("#{" ++ _, Mod) ->
     typename_to_spec("map()", Mod);
 typename_to_spec("qos()", _Mod) ->
-    #{type => string, enum => [0, 1, 2]};
+    #{type => integer, minimum => 0, maximum => 2, example => 0};
 typename_to_spec("{binary(), binary()}", _Mod) ->
     #{type => object, example => #{}};
 typename_to_spec("comma_separated_list()", _Mod) ->