From a76415c4f6d304a24b5130f2062fb09db59da006 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Tue, 27 Feb 2024 14:15:27 +0800 Subject: [PATCH] fix(mgmt): sub/unsub a share subscription to the client via http api - `/clients/:clientid/subscribe` - `/clients/:clientid/subscribe/bulk` - `/clients/:clientid/unsubscribe` - `/clients/:clientid/unsubscribe/bulk` --- apps/emqx/src/emqx_topic.erl | 7 ++++--- apps/emqx_management/src/emqx_management.app.src | 2 +- apps/emqx_management/src/emqx_mgmt_api_clients.erl | 7 +++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/emqx/src/emqx_topic.erl b/apps/emqx/src/emqx_topic.erl index bc6946a43..30744b300 100644 --- a/apps/emqx/src/emqx_topic.erl +++ b/apps/emqx/src/emqx_topic.erl @@ -269,10 +269,11 @@ do_join(_TopicAcc, [C | Words]) when ?MULTI_LEVEL_WILDCARD_NOT_LAST(C, Words) -> do_join(TopicAcc, [Word | Words]) -> do_join(<>, Words). --spec parse(topic() | {topic(), map()}) -> {topic() | share(), map()}. -parse(TopicFilter) when is_binary(TopicFilter) -> +-spec parse(TF | {TF, map()}) -> {TF, map()} when + TF :: topic() | share(). +parse(TopicFilter) when ?IS_TOPIC(TopicFilter) -> parse(TopicFilter, #{}); -parse({TopicFilter, Options}) when is_binary(TopicFilter) -> +parse({TopicFilter, Options}) when ?IS_TOPIC(TopicFilter) -> parse(TopicFilter, Options). -spec parse(topic() | share(), map()) -> {topic() | share(), map()}. diff --git a/apps/emqx_management/src/emqx_management.app.src b/apps/emqx_management/src/emqx_management.app.src index a44983596..ad9e12b90 100644 --- a/apps/emqx_management/src/emqx_management.app.src +++ b/apps/emqx_management/src/emqx_management.app.src @@ -2,7 +2,7 @@ {application, emqx_management, [ {description, "EMQX Management API and CLI"}, % strict semver, bump manually! - {vsn, "5.0.37"}, + {vsn, "5.0.38"}, {modules, []}, {registered, [emqx_management_sup]}, {applications, [ diff --git a/apps/emqx_management/src/emqx_mgmt_api_clients.erl b/apps/emqx_management/src/emqx_mgmt_api_clients.erl index f394ffefa..ef4fd2e63 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_clients.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_clients.erl @@ -781,10 +781,13 @@ subscribe_batch(#{clientid := ClientID, topics := Topics}) -> end. unsubscribe(#{clientid := ClientID, topic := Topic}) -> + {NTopic, _} = emqx_topic:parse(Topic), case do_unsubscribe(ClientID, Topic) of {error, channel_not_found} -> {404, ?CLIENTID_NOT_FOUND}; - {unsubscribe, [{Topic, #{}}]} -> + {unsubscribe, [{UnSubedT, #{}}]} when + (UnSubedT =:= NTopic) orelse (UnSubedT =:= Topic) + -> {204} end. @@ -809,7 +812,7 @@ do_subscribe(ClientID, Topic0, Options) -> {subscribe, Subscriptions, Node} -> case proplists:is_defined(Topic, Subscriptions) of true -> - {ok, Options#{node => Node, clientid => ClientID, topic => Topic}}; + {ok, Options#{node => Node, clientid => ClientID, topic => Topic0}}; false -> {error, unknow_error} end