From e9fe345ac8f44850e44bd4b787a70281964426c3 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Mon, 7 Jun 2021 19:52:08 +0800 Subject: [PATCH] fix(emqx_data_bridge): correct the format of HTTP responses --- .../emqx_data_bridge/src/emqx_data_bridge.erl | 18 ++++++- .../src/emqx_data_bridge_api.erl | 24 ++++----- .../src/emqx_data_bridge_config_handler.erl | 54 +++++++++++++++++++ .../src/emqx_data_bridge_monitor.erl | 2 +- 4 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 apps/emqx_data_bridge/src/emqx_data_bridge_config_handler.erl diff --git a/apps/emqx_data_bridge/src/emqx_data_bridge.erl b/apps/emqx_data_bridge/src/emqx_data_bridge.erl index 0f6c42246..a5a3087dc 100644 --- a/apps/emqx_data_bridge/src/emqx_data_bridge.erl +++ b/apps/emqx_data_bridge/src/emqx_data_bridge.erl @@ -2,7 +2,10 @@ -export([ load_bridges/0 , resource_type/1 - , resource_id/1 + , name_to_resource_id/1 + , resource_id_to_name/1 + , list_bridges/0 + , is_bridge/1 ]). load_bridges() -> @@ -12,5 +15,16 @@ load_bridges() -> resource_type(<<"mysql">>) -> emqx_connector_mysql. -resource_id(BridgeName) -> +name_to_resource_id(BridgeName) -> <<"bridge:", BridgeName/binary>>. + +resource_id_to_name(<<"bridge:", BridgeName/binary>> = _ResourceId) -> + BridgeName. + +list_bridges() -> + emqx_resource_api:list_instances(fun emqx_data_bridge:is_bridge/1). + +is_bridge(#{id := <<"bridge:", _/binary>>}) -> + true; +is_bridge(_Data) -> + false. diff --git a/apps/emqx_data_bridge/src/emqx_data_bridge_api.erl b/apps/emqx_data_bridge/src/emqx_data_bridge_api.erl index ceb4201e1..7d2f5274e 100644 --- a/apps/emqx_data_bridge/src/emqx_data_bridge_api.erl +++ b/apps/emqx_data_bridge/src/emqx_data_bridge_api.erl @@ -43,12 +43,13 @@ ]). list_bridges(_Binding, _Params) -> - {200, #{code => 0, data => emqx_resource_api:list_instances(fun is_bridge/1)}}. + {200, #{code => 0, data => [format_api_reply(Data) || + Data <- emqx_data_bridge:list_bridges()]}}. get_bridge(#{name := Name}, _Params) -> - case emqx_resource:get_instance(emqx_data_bridge:resource_id(Name)) of + case emqx_resource:get_instance(emqx_data_bridge:name_to_resource_id(Name)) of {ok, Data} -> - {200, #{code => 0, data => emqx_resource_api:format_data(Data)}}; + {200, #{code => 0, data => format_api_reply(emqx_resource_api:format_data(Data))}}; {error, not_found} -> {404, #{code => 102, message => <<"not_found: ", Name/binary>>}} end. @@ -57,10 +58,10 @@ create_bridge(#{name := Name}, Params) -> Config = proplists:get_value(<<"config">>, Params), BridgeType = proplists:get_value(<<"type">>, Params), case emqx_resource:check_and_create( - emqx_data_bridge:resource_id(Name), + emqx_data_bridge:name_to_resource_id(Name), emqx_data_bridge:resource_type(BridgeType), Config) of {ok, Data} -> - {200, #{code => 0, data => emqx_resource_api:format_data(Data)}}; + {200, #{code => 0, data => format_api_reply(emqx_resource_api:format_data(Data))}}; {error, already_created} -> {400, #{code => 102, message => <<"bridge already created: ", Name/binary>>}}; {error, Reason0} -> @@ -73,10 +74,10 @@ update_bridge(#{name := Name}, Params) -> Config = proplists:get_value(<<"config">>, Params), BridgeType = proplists:get_value(<<"type">>, Params), case emqx_resource:check_and_update( - emqx_data_bridge:resource_id(Name), + emqx_data_bridge:name_to_resource_id(Name), emqx_data_bridge:resource_type(BridgeType), Config, []) of {ok, Data} -> - {200, #{code => 0, data => emqx_resource_api:format_data(Data)}}; + {200, #{code => 0, data => format_api_reply(emqx_resource_api:format_data(Data))}}; {error, not_found} -> {400, #{code => 102, message => <<"bridge not_found: ", Name/binary>>}}; {error, Reason0} -> @@ -86,13 +87,12 @@ update_bridge(#{name := Name}, Params) -> end. delete_bridge(#{name := Name}, _Params) -> - case emqx_resource:remove(emqx_data_bridge:resource_id(Name)) of + case emqx_resource:remove(emqx_data_bridge:name_to_resource_id(Name)) of ok -> {200, #{code => 0, data => #{}}}; {error, Reason} -> {500, #{code => 102, message => emqx_resource_api:stringnify(Reason)}} end. -is_bridge(#{id := <<"bridge:", _/binary>>}) -> - true; -is_bridge(_Data) -> - false. +format_api_reply(#{resource_type := Type, id := Id, config := Conf, status := Status}) -> + #{type => Type, name => emqx_data_bridge:resource_id_to_name(Id), + config => Conf, status => Status}. diff --git a/apps/emqx_data_bridge/src/emqx_data_bridge_config_handler.erl b/apps/emqx_data_bridge/src/emqx_data_bridge_config_handler.erl new file mode 100644 index 000000000..f4efb0754 --- /dev/null +++ b/apps/emqx_data_bridge/src/emqx_data_bridge_config_handler.erl @@ -0,0 +1,54 @@ +-module(emqx_data_bridge_config_handler). + +-behaviour(gen_server). + +%% API functions +-export([ start_link/0 + , notify_updated/0 + ]). + +%% gen_server callbacks +-export([init/1, + handle_call/3, + handle_cast/2, + handle_info/2, + terminate/2, + code_change/3]). + +-record(state, {}). + +start_link() -> + gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + +notify_updated() -> + gen_server:cast(?MODULE, updated). + +init([]) -> + {ok, #state{}}. + +handle_call(_Request, _From, State) -> + Reply = ok, + {reply, Reply, State}. + +handle_cast(updated, State) -> + Configs = [format_conf(Data) || Data <- emqx_data_bridge:list_bridges()], + emqx_config_handler ! {emqx_data_bridge, Configs}, + {noreply, State}; + +handle_cast(_Msg, State) -> + {noreply, State}. + +handle_info(_Info, State) -> + {noreply, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%============================================================================ + +format_conf(#{resource_type := Type, id := Id, config := Conf}) -> + #{type => Type, name => emqx_data_bridge:resource_id_to_name(Id), + config => Conf}. diff --git a/apps/emqx_data_bridge/src/emqx_data_bridge_monitor.erl b/apps/emqx_data_bridge/src/emqx_data_bridge_monitor.erl index 6073602b9..243d81237 100644 --- a/apps/emqx_data_bridge/src/emqx_data_bridge_monitor.erl +++ b/apps/emqx_data_bridge/src/emqx_data_bridge_monitor.erl @@ -55,7 +55,7 @@ load_bridges(Configs) -> load_bridge(#{<<"name">> := Name, <<"type">> := Type, <<"config">> := Config}) -> case emqx_resource:check_and_create_local( - emqx_data_bridge:resource_id(Name), + emqx_data_bridge:name_to_resource_id(Name), emqx_data_bridge:resource_type(Type), Config) of {ok, _} -> ok; {error, already_created} -> ok;