diff --git a/apps/emqx_rule_engine/include/rule_engine.hrl b/apps/emqx_rule_engine/include/rule_engine.hrl index b7ec37d8e..4884f329e 100644 --- a/apps/emqx_rule_engine/include/rule_engine.hrl +++ b/apps/emqx_rule_engine/include/rule_engine.hrl @@ -44,6 +44,7 @@ -type rule() :: #{ id := rule_id() + , name := binary() , sql := binary() , outputs := [output()] , enabled := boolean() diff --git a/apps/emqx_rule_engine/src/emqx_rule_api_schema.erl b/apps/emqx_rule_engine/src/emqx_rule_api_schema.erl index 1fe75447e..b3b7afe4e 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_api_schema.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_api_schema.erl @@ -38,14 +38,11 @@ roots() -> ]. fields("rule_creation") -> - [ {"id", sc(binary(), - #{ desc => "The Id of the rule", nullable => false - , example => "my_rule_id" - })} - ] ++ emqx_rule_engine_schema:fields("rules"); + emqx_rule_engine_schema:fields("rules"); fields("rule_info") -> - [ {"metrics", sc(ref("metrics"), #{desc => "The metrics of the rule"})} + [ rule_id() + , {"metrics", sc(ref("metrics"), #{desc => "The metrics of the rule"})} , {"node_metrics", sc(ref("node_metrics"), #{desc => "The metrics of the rule"})} , {"from", sc(hoconsc:array(binary()), #{desc => "The topics of the rule", example => "t/#"})} @@ -182,5 +179,11 @@ qos() -> {"qos", sc(hoconsc:union([typerefl:integer(0), typerefl:integer(1), typerefl:integer(2)]), #{desc => "The Message QoS"})}. +rule_id() -> + {"id", sc(binary(), + #{ desc => "The Id of the rule", nullable => false + , example => "293fb66f" + })}. + sc(Type, Meta) -> hoconsc:mk(Type, Meta). ref(Field) -> hoconsc:ref(?MODULE, Field). diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.erl b/apps/emqx_rule_engine/src/emqx_rule_engine.erl index 974c6b8a4..35be28610 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.erl @@ -221,6 +221,7 @@ do_create_rule(Params = #{id := RuleId, sql := Sql, outputs := Outputs}) -> {ok, Select} -> Rule = #{ id => RuleId, + name => maps:get(name, Params, <<"">>), created_at => erlang:system_time(millisecond), enabled => maps:get(enabled, Params, true), sql => Sql, diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl index 75238fb71..7cfeb5d7e 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl @@ -59,9 +59,6 @@ error_schema(Code, Message) -> rule_creation_schema() -> ref(emqx_rule_api_schema, "rule_creation"). -rule_update_schema() -> - ref(emqx_rule_engine_schema, "rules"). - rule_test_schema() -> ref(emqx_rule_api_schema, "rule_test"). @@ -120,7 +117,7 @@ schema("/rules/:id") -> description => <<"Update a rule by given Id to all nodes in the cluster">>, summary => <<"Update a Rule">>, parameters => param_path_id(), - requestBody => rule_update_schema(), + requestBody => rule_creation_schema(), responses => #{ 400 => error_schema('BAD_ARGS', "Invalid Parameters"), 200 => rule_info_schema() @@ -167,7 +164,8 @@ param_path_id() -> Records = emqx_rule_engine:get_rules_ordered_by_ts(), {200, format_rule_resp(Records)}; -'/rules'(post, #{body := #{<<"id">> := Id} = Params}) -> +'/rules'(post, #{body := Params}) -> + Id = maps:get(<<"id">>, Params, list_to_binary(emqx_misc:gen_id(8))), ConfPath = emqx_rule_engine:config_key_path() ++ [Id], case emqx_rule_engine:get_rule(Id) of {ok, _Rule} -> @@ -230,7 +228,8 @@ err_msg(Msg) -> format_rule_resp(Rules) when is_list(Rules) -> [format_rule_resp(R) || R <- Rules]; -format_rule_resp(#{ id := Id, created_at := CreatedAt, +format_rule_resp(#{ id := Id, name := Name, + created_at := CreatedAt, from := Topics, outputs := Output, sql := SQL, @@ -238,6 +237,7 @@ format_rule_resp(#{ id := Id, created_at := CreatedAt, description := Descr}) -> NodeMetrics = get_rule_metrics(Id), #{id => Id, + name => Name, from => Topics, outputs => format_output(Output), sql => SQL, diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_schema.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_schema.erl index 36cf48da0..ba516bfa7 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_schema.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_schema.erl @@ -39,7 +39,8 @@ fields("rule_engine") -> ]; fields("rules") -> - [ {"sql", sc(binary(), + [ rule_name() + , {"sql", sc(binary(), #{ desc => """ SQL query to transform the messages.
Example: SELECT * FROM \"test/topic\" WHERE payload.x = 1
@@ -177,6 +178,13 @@ of the rule, then the string \"undefined\" is used. })} ]. +rule_name() -> + {"name", sc(binary(), + #{ desc => "The name of the rule" + , default => "" + , example => "foo" + })}. + outputs() -> [ binary() , ref("builtin_output_republish")