|
|
@@ -39,8 +39,9 @@
|
|
|
subscriptions/2,
|
|
|
authz_cache/2,
|
|
|
subscribe/2,
|
|
|
- unsubscribe/2,
|
|
|
subscribe_batch/2,
|
|
|
+ unsubscribe/2,
|
|
|
+ unsubscribe_batch/2,
|
|
|
set_keepalive/2
|
|
|
]).
|
|
|
|
|
|
@@ -88,7 +89,9 @@ paths() ->
|
|
|
"/clients/:clientid/authorization/cache",
|
|
|
"/clients/:clientid/subscriptions",
|
|
|
"/clients/:clientid/subscribe",
|
|
|
+ "/clients/:clientid/subscribe/bulk",
|
|
|
"/clients/:clientid/unsubscribe",
|
|
|
+ "/clients/:clientid/unsubscribe/bulk",
|
|
|
"/clients/:clientid/keepalive"
|
|
|
].
|
|
|
|
|
|
@@ -293,6 +296,21 @@ schema("/clients/:clientid/subscribe") ->
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
+schema("/clients/:clientid/subscribe/bulk") ->
|
|
|
+ #{
|
|
|
+ 'operationId' => subscribe_batch,
|
|
|
+ post => #{
|
|
|
+ description => <<"Subscribe">>,
|
|
|
+ parameters => [{clientid, hoconsc:mk(binary(), #{in => path})}],
|
|
|
+ 'requestBody' => hoconsc:mk(hoconsc:array(hoconsc:ref(?MODULE, subscribe))),
|
|
|
+ responses => #{
|
|
|
+ 200 => hoconsc:array(hoconsc:ref(emqx_mgmt_api_subscriptions, subscription)),
|
|
|
+ 404 => emqx_dashboard_swagger:error_codes(
|
|
|
+ ['CLIENTID_NOT_FOUND'], <<"Client id not found">>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
schema("/clients/:clientid/unsubscribe") ->
|
|
|
#{
|
|
|
'operationId' => unsubscribe,
|
|
|
@@ -308,6 +326,21 @@ schema("/clients/:clientid/unsubscribe") ->
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
+schema("/clients/:clientid/unsubscribe/bulk") ->
|
|
|
+ #{
|
|
|
+ 'operationId' => unsubscribe_batch,
|
|
|
+ post => #{
|
|
|
+ description => <<"Unsubscribe">>,
|
|
|
+ parameters => [{clientid, hoconsc:mk(binary(), #{in => path})}],
|
|
|
+ 'requestBody' => hoconsc:mk(hoconsc:array(hoconsc:ref(?MODULE, unsubscribe))),
|
|
|
+ responses => #{
|
|
|
+ 204 => <<"Unsubscribe OK">>,
|
|
|
+ 404 => emqx_dashboard_swagger:error_codes(
|
|
|
+ ['CLIENTID_NOT_FOUND'], <<"Client id not found">>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
schema("/clients/:clientid/keepalive") ->
|
|
|
#{
|
|
|
'operationId' => set_keepalive,
|
|
|
@@ -543,11 +576,6 @@ subscribe(post, #{bindings := #{clientid := ClientID}, body := TopicInfo}) ->
|
|
|
Opts = emqx_map_lib:unsafe_atom_key_map(TopicInfo),
|
|
|
subscribe(Opts#{clientid => ClientID}).
|
|
|
|
|
|
-unsubscribe(post, #{bindings := #{clientid := ClientID}, body := TopicInfo}) ->
|
|
|
- Topic = maps:get(<<"topic">>, TopicInfo),
|
|
|
- unsubscribe(#{clientid => ClientID, topic => Topic}).
|
|
|
-
|
|
|
-%% TODO: batch
|
|
|
subscribe_batch(post, #{bindings := #{clientid := ClientID}, body := TopicInfos}) ->
|
|
|
Topics =
|
|
|
[
|
|
|
@@ -556,6 +584,14 @@ subscribe_batch(post, #{bindings := #{clientid := ClientID}, body := TopicInfos}
|
|
|
],
|
|
|
subscribe_batch(#{clientid => ClientID, topics => Topics}).
|
|
|
|
|
|
+unsubscribe(post, #{bindings := #{clientid := ClientID}, body := TopicInfo}) ->
|
|
|
+ Topic = maps:get(<<"topic">>, TopicInfo),
|
|
|
+ unsubscribe(#{clientid => ClientID, topic => Topic}).
|
|
|
+
|
|
|
+unsubscribe_batch(post, #{bindings := #{clientid := ClientID}, body := TopicInfos}) ->
|
|
|
+ Topics = [Topic || #{<<"topic">> := Topic} <- TopicInfos],
|
|
|
+ unsubscribe_batch(#{clientid => ClientID, topics => Topics}).
|
|
|
+
|
|
|
subscriptions(get, #{bindings := #{clientid := ClientID}}) ->
|
|
|
case emqx_mgmt:list_client_subscriptions(ClientID) of
|
|
|
[] ->
|
|
|
@@ -668,9 +704,20 @@ subscribe(#{clientid := ClientID, topic := Topic} = Sub) ->
|
|
|
{error, Reason} ->
|
|
|
Message = list_to_binary(io_lib:format("~p", [Reason])),
|
|
|
{500, #{code => <<"UNKNOW_ERROR">>, message => Message}};
|
|
|
- {ok, Node} ->
|
|
|
- Response = Sub#{node => Node},
|
|
|
- {200, Response}
|
|
|
+ {ok, SubInfo} ->
|
|
|
+ {200, SubInfo}
|
|
|
+ end.
|
|
|
+
|
|
|
+subscribe_batch(#{clientid := ClientID, topics := Topics}) ->
|
|
|
+ case lookup(#{clientid => ClientID}) of
|
|
|
+ {200, _} ->
|
|
|
+ ArgList = [
|
|
|
+ [ClientID, Topic, maps:with([qos, nl, rap, rh], Sub)]
|
|
|
+ || #{topic := Topic} = Sub <- Topics
|
|
|
+ ],
|
|
|
+ {200, emqx_mgmt_util:batch_operation(?MODULE, do_subscribe, ArgList)};
|
|
|
+ {404, ?CLIENT_ID_NOT_FOUND} ->
|
|
|
+ {404, ?CLIENT_ID_NOT_FOUND}
|
|
|
end.
|
|
|
|
|
|
unsubscribe(#{clientid := ClientID, topic := Topic}) ->
|
|
|
@@ -681,12 +728,14 @@ unsubscribe(#{clientid := ClientID, topic := Topic}) ->
|
|
|
{204}
|
|
|
end.
|
|
|
|
|
|
-subscribe_batch(#{clientid := ClientID, topics := Topics}) ->
|
|
|
- ArgList = [
|
|
|
- [ClientID, Topic, maps:with([qos, nl, rap, rh], Sub)]
|
|
|
- || #{topic := Topic} = Sub <- Topics
|
|
|
- ],
|
|
|
- emqx_mgmt_util:batch_operation(?MODULE, do_subscribe, ArgList).
|
|
|
+unsubscribe_batch(#{clientid := ClientID, topics := Topics}) ->
|
|
|
+ case lookup(#{clientid => ClientID}) of
|
|
|
+ {200, _} ->
|
|
|
+ _ = emqx_mgmt:unsubscribe_batch(ClientID, Topics),
|
|
|
+ {204};
|
|
|
+ {404, ?CLIENT_ID_NOT_FOUND} ->
|
|
|
+ {404, ?CLIENT_ID_NOT_FOUND}
|
|
|
+ end.
|
|
|
|
|
|
%%--------------------------------------------------------------------
|
|
|
%% internal function
|
|
|
@@ -700,7 +749,7 @@ do_subscribe(ClientID, Topic0, Options) ->
|
|
|
{subscribe, Subscriptions, Node} ->
|
|
|
case proplists:is_defined(Topic, Subscriptions) of
|
|
|
true ->
|
|
|
- {ok, Node};
|
|
|
+ {ok, Options#{node => Node, clientid => ClientID, topic => Topic}};
|
|
|
false ->
|
|
|
{error, unknow_error}
|
|
|
end
|