From ec74f77ad828bba5a28501e2846c61fa9562c57b Mon Sep 17 00:00:00 2001 From: Stefan Strigler Date: Fri, 15 Dec 2023 14:23:33 +0100 Subject: [PATCH] refactor(emqx_bridge): common api_fields fn for actions --- .../src/schema/emqx_bridge_schema.erl | 9 +- .../src/schema/emqx_bridge_v2_schema.erl | 22 ++++ .../src/emqx_bridge_mongodb.erl | 104 +++++------------- .../src/emqx_bridge_mysql.erl | 12 +- 4 files changed, 63 insertions(+), 84 deletions(-) diff --git a/apps/emqx_bridge/src/schema/emqx_bridge_schema.erl b/apps/emqx_bridge/src/schema/emqx_bridge_schema.erl index aa58d825e..ac2c3d704 100644 --- a/apps/emqx_bridge/src/schema/emqx_bridge_schema.erl +++ b/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 diff --git a/apps/emqx_bridge/src/schema/emqx_bridge_v2_schema.erl b/apps/emqx_bridge/src/schema/emqx_bridge_v2_schema.erl index 563c2e7df..5c3ca5759 100644 --- a/apps/emqx_bridge/src/schema/emqx_bridge_v2_schema.erl +++ b/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 %%====================================================================================== diff --git a/apps/emqx_bridge_mongodb/src/emqx_bridge_mongodb.erl b/apps/emqx_bridge_mongodb/src/emqx_bridge_mongodb.erl index c02c47155..5ba73303f 100644 --- a/apps/emqx_bridge_mongodb/src/emqx_bridge_mongodb.erl +++ b/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 => <>, - 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) -> - #{}. diff --git a/apps/emqx_bridge_mysql/src/emqx_bridge_mysql.erl b/apps/emqx_bridge_mysql/src/emqx_bridge_mysql.erl index 6f1036600..65888cab4 100644 --- a/apps/emqx_bridge_mysql/src/emqx_bridge_mysql.erl +++ b/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";