浏览代码

Merge pull request #12184 from sstrigler/EMQX-11587-use-common-functions-to-create-api-schemata-and-examples-in-action-implementations

refactor(emqx_bridge): common api_fields fn for actions
Stefan Strigler 2 年之前
父节点
当前提交
a5978aa39a

+ 8 - 1
apps/emqx_bridge/src/schema/emqx_bridge_schema.erl

@@ -31,8 +31,9 @@
 
 -export([
     common_bridge_fields/0,
+    metrics_fields/0,
     status_fields/0,
-    metrics_fields/0
+    type_and_name_fields/1
 ]).
 
 %% for testing only
@@ -156,6 +157,12 @@ metrics_fields() ->
             )}
     ].
 
+type_and_name_fields(ConnectorType) ->
+    [
+        {type, mk(ConnectorType, #{required => true, desc => ?DESC("desc_type")})},
+        {name, mk(binary(), #{required => true, desc => ?DESC("desc_name")})}
+    ].
+
 %%======================================================================================
 %% For config files
 

+ 22 - 0
apps/emqx_bridge/src/schema/emqx_bridge_v2_schema.erl

@@ -45,6 +45,10 @@
 -export([types/0, types_sc/0]).
 -export([resource_opts_fields/0, resource_opts_fields/1]).
 
+-export([
+    api_fields/3
+]).
+
 -export([
     make_producer_action_schema/1,
     make_consumer_action_schema/1,
@@ -153,6 +157,24 @@ method_values(get, Type) ->
 method_values(put, _Type) ->
     #{}.
 
+api_fields("get_bridge_v2", Type, Fields) ->
+    lists:append(
+        [
+            emqx_bridge_schema:type_and_name_fields(Type),
+            emqx_bridge_schema:status_fields(),
+            Fields
+        ]
+    );
+api_fields("post_bridge_v2", Type, Fields) ->
+    lists:append(
+        [
+            emqx_bridge_schema:type_and_name_fields(Type),
+            Fields
+        ]
+    );
+api_fields("put_bridge_v2", _Type, Fields) ->
+    Fields.
+
 %%======================================================================================
 %% HOCON Schema Callbacks
 %%======================================================================================

+ 27 - 77
apps/emqx_bridge_mongodb/src/emqx_bridge_mongodb.erl

@@ -26,6 +26,7 @@
 ]).
 
 -define(CONNECTOR_TYPE, mongodb).
+-define(ACTION_TYPE, mongodb).
 
 %%=================================================================================================
 %% hocon_schema API
@@ -111,20 +112,18 @@ fields(Field) when
         fields("connection_fields") ++
             emqx_connector_schema:resource_opts_ref(?MODULE, connector_resource_opts),
     emqx_connector_schema:api_fields(Field, ?CONNECTOR_TYPE, Fields);
-fields("get_bridge_v2") ->
-    emqx_bridge_schema:status_fields() ++
-        fields("post_bridge_v2");
-fields("post_bridge_v2") ->
-    type_and_name_fields(mongodb) ++
-        fields(mongodb_action);
-fields("put_bridge_v2") ->
-    fields(mongodb_action);
+fields(Field) when
+    Field == "get_bridge_v2";
+    Field == "post_bridge_v2";
+    Field == "put_bridge_v2"
+->
+    emqx_bridge_v2_schema:api_fields(Field, ?ACTION_TYPE, fields(mongodb_action));
 fields("post_rs") ->
-    fields(mongodb_rs) ++ type_and_name_fields(mongodb_rs);
+    fields(mongodb_rs) ++ emqx_bridge_schema:type_and_name_fields(mongodb_rs);
 fields("post_sharded") ->
-    fields(mongodb_sharded) ++ type_and_name_fields(mongodb_sharded);
+    fields(mongodb_sharded) ++ emqx_bridge_schema:type_and_name_fields(mongodb_sharded);
 fields("post_single") ->
-    fields(mongodb_single) ++ type_and_name_fields(mongodb_single);
+    fields(mongodb_single) ++ emqx_bridge_schema:type_and_name_fields(mongodb_single);
 fields("put_rs") ->
     fields(mongodb_rs);
 fields("put_sharded") ->
@@ -134,22 +133,24 @@ fields("put_single") ->
 fields("get_rs") ->
     emqx_bridge_schema:status_fields() ++
         fields(mongodb_rs) ++
-        type_and_name_fields(mongodb_rs);
+        emqx_bridge_schema:type_and_name_fields(mongodb_rs);
 fields("get_sharded") ->
     emqx_bridge_schema:status_fields() ++
         fields(mongodb_sharded) ++
-        type_and_name_fields(mongodb_sharded);
+        emqx_bridge_schema:type_and_name_fields(mongodb_sharded);
 fields("get_single") ->
     emqx_bridge_schema:status_fields() ++
         fields(mongodb_single) ++
-        type_and_name_fields(mongodb_single).
+        emqx_bridge_schema:type_and_name_fields(mongodb_single).
 
 bridge_v2_examples(Method) ->
     [
         #{
             <<"mongodb">> => #{
                 summary => <<"MongoDB Action">>,
-                value => action_values(Method)
+                value => emqx_bridge_v2_schema:action_values(
+                    Method, mongodb, mongodb, #{parameters => #{collection => <<"mycol">>}}
+                )
             }
         }
     ].
@@ -181,19 +182,25 @@ connector_examples(Method) ->
         #{
             <<"mongodb_rs">> => #{
                 summary => <<"MongoDB Replica Set Connector">>,
-                value => connector_values(mongodb_rs, Method)
+                value => emqx_connector_schema:connector_values(
+                    Method, mongodb_rs, #{parameters => connector_values()}
+                )
             }
         },
         #{
             <<"mongodb_sharded">> => #{
                 summary => <<"MongoDB Sharded Connector">>,
-                value => connector_values(mongodb_sharded, Method)
+                value => emqx_connector_schema:connector_values(
+                    Method, mongodb_sharded, #{parameters => connector_values()}
+                )
             }
         },
         #{
             <<"mongodb_single">> => #{
                 summary => <<"MongoDB Standalone Connector">>,
-                value => connector_values(mongodb_single, Method)
+                value => emqx_connector_schema:connector_values(
+                    Method, mongodb_single, #{parameters => connector_values()}
+                )
             }
         }
     ].
@@ -227,40 +234,6 @@ desc(_) ->
 %% Internal fns
 %%=================================================================================================
 
-type_and_name_fields(MongoType) ->
-    [
-        {type, mk(MongoType, #{required => true, desc => ?DESC("desc_type")})},
-        {name, mk(binary(), #{required => true, desc => ?DESC("desc_name")})}
-    ].
-
-connector_values(Type, Method) ->
-    lists:foldl(
-        fun(M1, M2) ->
-            maps:merge(M1, M2)
-        end,
-        #{
-            description => <<"My example connector">>,
-            parameters => mongo_type_opts(Type)
-        },
-        [
-            common_values(),
-            method_values(mongodb, Method)
-        ]
-    ).
-
-action_values(Method) ->
-    maps:merge(
-        method_values(mongodb, Method),
-        #{
-            description => <<"My example action">>,
-            enable => true,
-            connector => <<"my_mongodb_connector">>,
-            parameters => #{
-                collection => <<"mycol">>
-            }
-        }
-    ).
-
 values(MongoType, Method) ->
     maps:merge(
         mongo_type_opts(MongoType),
@@ -298,10 +271,10 @@ bridge_values(Type, _Method) ->
             type => TypeBin,
             collection => <<"mycol">>
         },
-        common_values()
+        connector_values()
     ).
 
-common_values() ->
+connector_values() ->
     #{
         enable => true,
         database => <<"mqtt">>,
@@ -310,26 +283,3 @@ common_values() ->
         username => <<"myuser">>,
         password => <<"******">>
     }.
-
-method_values(Type, post) ->
-    TypeBin = atom_to_binary(Type),
-    #{
-        name => <<TypeBin/binary, "_demo">>,
-        type => TypeBin
-    };
-method_values(Type, get) ->
-    maps:merge(
-        method_values(Type, post),
-        #{
-            status => <<"connected">>,
-            node_status => [
-                #{
-                    node => <<"emqx@localhost">>,
-                    status => <<"connected">>
-                }
-            ],
-            actions => [<<"my_action">>]
-        }
-    );
-method_values(_Type, put) ->
-    #{}.

+ 6 - 6
apps/emqx_bridge_mysql/src/emqx_bridge_mysql.erl

@@ -160,12 +160,12 @@ fields("put") ->
     fields("config");
 fields("get") ->
     emqx_bridge_schema:status_fields() ++ fields("post");
-fields("get_bridge_v2") ->
-    emqx_bridge_schema:status_fields() ++ fields("post_bridge_v2");
-fields("post_bridge_v2") ->
-    [type_field(), name_field() | fields(mysql_action)];
-fields("put_bridge_v2") ->
-    fields(mysql_action);
+fields(Field) when
+    Field == "get_bridge_v2";
+    Field == "post_bridge_v2";
+    Field == "put_bridge_v2"
+->
+    emqx_bridge_v2_schema:api_fields(Field, ?ACTION_TYPE, fields(mysql_action));
 fields(Field) when
     Field == "get_connector";
     Field == "put_connector";