diff --git a/apps/emqx_gateway/src/emqx_gateway_api_clients.erl b/apps/emqx_gateway/src/emqx_gateway_api_clients.erl index 287d009e0..58723cd22 100644 --- a/apps/emqx_gateway/src/emqx_gateway_api_clients.erl +++ b/apps/emqx_gateway/src/emqx_gateway_api_clients.erl @@ -77,25 +77,21 @@ apis() -> -define(format_fun, {?MODULE, format_channel_info}). clients(get, #{ bindings := #{name := Name0} - , query_string := Qs + , query_string := Params }) -> with_gateway(Name0, fun(GwName, _) -> TabName = emqx_gateway_cm:tabname(info, GwName), - case maps:get(<<"node">>, Qs, undefined) of + case maps:get(<<"node">>, Params, undefined) of undefined -> - Response = emqx_mgmt_api:cluster_query( - Qs, TabName, - ?CLIENT_QS_SCHEMA, ?query_fun - ), - {200, Response}; + Response = emqx_mgmt_api:cluster_query(Params, TabName, + ?CLIENT_QS_SCHEMA, ?query_fun), + emqx_mgmt_util:generate_response(Response); Node1 -> Node = binary_to_atom(Node1, utf8), - ParamsWithoutNode = maps:without([<<"node">>], Qs), - Response = emqx_mgmt_api:node_query( - Node, ParamsWithoutNode, - TabName, ?CLIENT_QS_SCHEMA, ?query_fun - ), - {200, Response} + ParamsWithoutNode = maps:without([<<"node">>], Params), + Response = emqx_mgmt_api:node_query(Node, ParamsWithoutNode, + TabName, ?CLIENT_QS_SCHEMA, ?query_fun), + emqx_mgmt_util:generate_response(Response) end end). diff --git a/apps/emqx_management/src/emqx_mgmt_api.erl b/apps/emqx_management/src/emqx_mgmt_api.erl index a6bfaa3e8..c7da2e752 100644 --- a/apps/emqx_management/src/emqx_mgmt_api.erl +++ b/apps/emqx_management/src/emqx_mgmt_api.erl @@ -120,14 +120,7 @@ node_query(Node, Params, Tab, QsSchema, QueryFun) -> Limit = b2i(limit(Params)), Page = b2i(page(Params)), Meta = #{page => Page, limit => Limit, count => 0}, - case Meta of - #{page := Page, limit := Limit} - when Page < 1; Limit < 1 -> - {error, page_limit_invalid}; - _ -> - do_node_query(Node, Tab, Qs, QueryFun, Meta) - end. - + page_limit_check_query(Meta, {fun do_node_query/5, [Node, Tab, Qs, QueryFun, Meta]}). %% @private do_node_query(Node, Tab, Qs, QueryFun, Meta) -> @@ -176,13 +169,7 @@ cluster_query(Params, Tab, QsSchema, QueryFun) -> Page = b2i(page(Params)), Nodes = ekka_mnesia:running_nodes(), Meta = #{page => Page, limit => Limit, count => 0}, - case Meta of - #{page := Page, limit := Limit} - when Page < 1; Limit < 1 -> - {error, page_limit_invalid}; - _ -> - do_cluster_query(Nodes, Tab, Qs, QueryFun, Meta) - end. + page_limit_check_query(Meta, {fun do_cluster_query/5, [Nodes, Tab, Qs, QueryFun, Meta]}). %% @private do_cluster_query(Nodes, Tab, Qs, QueryFun, Meta) -> @@ -380,6 +367,15 @@ rows_sub_params(Len, _Meta = #{page := Page, limit := Limit, count := Count}) -> {_SubStart = 1, _NeedNowNum = Len} end. +page_limit_check_query(Meta, {F, A}) -> + case Meta of + #{page := Page, limit := Limit} + when Page < 1; Limit < 1 -> + {error, page_limit_invalid}; + _ -> + erlang:apply(F, A) + end. + %%-------------------------------------------------------------------- %% Types %%-------------------------------------------------------------------- diff --git a/apps/emqx_management/src/emqx_mgmt_api_alarms.erl b/apps/emqx_management/src/emqx_mgmt_api_alarms.erl index 3641f82b0..c4e49a616 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_alarms.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_alarms.erl @@ -79,7 +79,7 @@ alarms(get, #{query_string := Qs}) -> <<"false">> -> ?DEACTIVATED_ALARM end, Response = emqx_mgmt_api:cluster_query(Qs, Table, [], {?MODULE, query}), - {200, Response}; + emqx_mgmt_util:generate_response(Response); alarms(delete, _Params) -> _ = emqx_mgmt:delete_all_deactivated_alarms(), diff --git a/apps/emqx_management/src/emqx_mgmt_api_clients.erl b/apps/emqx_management/src/emqx_mgmt_api_clients.erl index 618976cb5..454f27466 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_clients.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_clients.erl @@ -264,7 +264,8 @@ clients_api() -> } ], responses => #{ - <<"200">> => emqx_mgmt_util:array_schema(client, <<"List clients 200 OK">>)}}}, + <<"200">> => emqx_mgmt_util:array_schema(client, <<"List clients 200 OK">>), + <<"400">> => emqx_mgmt_util:error_schema(<<"Invalid parameters">>, ['INVALID_PARAMETER'])}}}, {"/clients", Metadata, clients}. client_api() -> @@ -435,13 +436,13 @@ list(Params) -> undefined -> Response = emqx_mgmt_api:cluster_query(Params, Tab, QuerySchema, ?query_fun), - {200, Response}; + emqx_mgmt_util:generate_response(Response); Node1 -> Node = binary_to_atom(Node1, utf8), ParamsWithoutNode = maps:without([<<"node">>], Params), Response = emqx_mgmt_api:node_query(Node, ParamsWithoutNode, Tab, QuerySchema, ?query_fun), - {200, Response} + emqx_mgmt_util:generate_response(Response) end. lookup(#{clientid := ClientID}) -> diff --git a/apps/emqx_management/src/emqx_mgmt_api_routes.erl b/apps/emqx_management/src/emqx_mgmt_api_routes.erl index e95679400..28ddb8ca2 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_routes.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_routes.erl @@ -37,6 +37,7 @@ , error_schema/2 , properties/1 , page_params/0 + , generate_response/1 ]). api_spec() -> @@ -54,7 +55,8 @@ routes_api() -> description => <<"EMQ X routes">>, parameters => [topic_param(query) , node_param()] ++ page_params(), responses => #{ - <<"200">> => object_array_schema(properties(), <<"List route info">>) + <<"200">> => object_array_schema(properties(), <<"List route info">>), + <<"400">> => error_schema(<<"Invalid parameters">>, ['INVALID_PARAMETER']) } } }, @@ -87,7 +89,7 @@ route(get, #{bindings := Bindings}) -> %% api apply list(Params) -> Response = emqx_mgmt_api:node_query(node(), Params, emqx_route, ?ROUTES_QS_SCHEMA, {?MODULE, query}), - {200, Response}. + generate_response(Response). lookup(#{topic := Topic}) -> case emqx_mgmt:lookup_routes(Topic) of diff --git a/apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl b/apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl index 2be5773f3..81022f580 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl @@ -21,6 +21,7 @@ -include_lib("emqx/include/emqx.hrl"). -import(emqx_mgmt_util, [ page_schema/1 + , error_schema/2 , properties/1 , page_params/0 ]). @@ -53,7 +54,8 @@ subscriptions_api() -> description => <<"List subscriptions">>, parameters => parameters(), responses => #{ - <<"200">> => page_schema(subscription) + <<"200">> => page_schema(subscription), + <<"400">> => error_schema(<<"Invalid parameters">>, ['INVALID_PARAMETER']) } } }, @@ -114,11 +116,13 @@ list(Params) -> {Tab, QuerySchema} = ?SUBS_QS_SCHEMA, case maps:get(<<"node">>, Params, undefined) of undefined -> - {200, emqx_mgmt_api:cluster_query(Params, Tab, - QuerySchema, ?query_fun)}; + Response = emqx_mgmt_api:cluster_query(Params, Tab, + QuerySchema, ?query_fun), + emqx_mgmt_util:generate_response(Response); Node -> - {200, emqx_mgmt_api:node_query(binary_to_atom(Node, utf8), Params, - Tab, QuerySchema, ?query_fun)} + Response = emqx_mgmt_api:node_query(binary_to_atom(Node, utf8), Params, + Tab, QuerySchema, ?query_fun), + emqx_mgmt_util:generate_response(Response) end. format(Items) when is_list(Items) -> diff --git a/apps/emqx_management/src/emqx_mgmt_util.erl b/apps/emqx_management/src/emqx_mgmt_util.erl index bba72e1c2..b276988bd 100644 --- a/apps/emqx_management/src/emqx_mgmt_util.erl +++ b/apps/emqx_management/src/emqx_mgmt_util.erl @@ -43,6 +43,7 @@ , batch_schema/1 ]). +-export([generate_response/1]). -export([urldecode/1]). @@ -258,3 +259,13 @@ bad_request() -> bad_request(Desc) -> object_schema(properties([{message, string}, {code, string}]), Desc). +%%%============================================================================================== +%% Response util + +generate_response(QueryResult) -> + case QueryResult of + {error, page_limit_invalid} -> + {400, #{code => <<"INVALID_PARAMETER">>, message => <<"page_limit_invalid">>}}; + Response -> + {200, Response} + end.