fix(retain): add `hasnext` into the meta data for the `GET /retain/messages`

This commit is contained in:
firest 2024-01-11 15:39:36 +08:00
parent 7b211b5a23
commit f896cf2f4f
4 changed files with 37 additions and 27 deletions

View File

@ -78,7 +78,7 @@
-callback store_retained(context(), message()) -> ok.
-callback read_message(context(), topic()) -> {ok, list()}.
-callback page_read(context(), topic(), non_neg_integer(), non_neg_integer()) ->
{ok, list()}.
{ok, HasNext :: boolean(), list()}.
-callback match_messages(context(), topic(), cursor()) -> {ok, list(), cursor()}.
-callback clear_expired(context()) -> ok.
-callback clean(context()) -> ok.

View File

@ -181,15 +181,27 @@ lookup_retained(get, #{query_string := Qs}) ->
Page = maps:get(<<"page">>, Qs, 1),
Limit = maps:get(<<"limit">>, Qs, emqx_mgmt:default_row_limit()),
Topic = maps:get(<<"topic">>, Qs, undefined),
{ok, Msgs} = emqx_retainer_mnesia:page_read(undefined, Topic, Page, Limit),
{ok, HasNext, Msgs} = emqx_retainer_mnesia:page_read(undefined, Topic, Page, Limit),
Meta =
case Topic of
undefined ->
#{count => emqx_retainer_mnesia:size(?TAB_MESSAGE)};
_ ->
#{}
end,
{200, #{
data => [format_message(Msg) || Msg <- Msgs],
meta => #{page => Page, limit => Limit, count => emqx_retainer_mnesia:size(?TAB_MESSAGE)}
meta =>
Meta#{
page => Page,
limit => Limit,
hasnext => HasNext
}
}}.
with_topic(get, #{bindings := Bindings}) ->
Topic = maps:get(topic, Bindings),
{ok, Msgs} = emqx_retainer_mnesia:page_read(undefined, Topic, 1, 1),
{ok, _, Msgs} = emqx_retainer_mnesia:page_read(undefined, Topic, 1, 1),
case Msgs of
[H | _] ->
{200, format_detail_message(H)};
@ -202,12 +214,12 @@ with_topic(get, #{bindings := Bindings}) ->
with_topic(delete, #{bindings := Bindings}) ->
Topic = maps:get(topic, Bindings),
case emqx_retainer_mnesia:page_read(undefined, Topic, 1, 1) of
{ok, []} ->
{ok, _, []} ->
{404, #{
code => <<"NOT_FOUND">>,
message => <<"Viewed message doesn't exist">>
}};
{ok, _} ->
{ok, _, _} ->
emqx_retainer_mnesia:delete_message(undefined, Topic),
{204}
end.

View File

@ -231,20 +231,18 @@ page_read(_, Topic, Page, Limit) ->
false ->
more
end,
PageRows =
case SkipResult of
closed ->
[];
more ->
case qlc_next_answers(Cursor, Limit) of
{closed, Rows} ->
Rows;
{more, Rows} ->
qlc:delete_cursor(Cursor),
Rows
end
end,
{ok, PageRows}.
case SkipResult of
closed ->
{ok, false, []};
more ->
case qlc_next_answers(Cursor, Limit) of
{closed, Rows} ->
{ok, false, Rows};
{more, Rows} ->
qlc:delete_cursor(Cursor),
{ok, true, Rows}
end
end.
clean(_) ->
_ = mria:clear_table(?TAB_MESSAGE),

View File

@ -133,7 +133,7 @@ t_store_and_clean(_) ->
),
timer:sleep(100),
{ok, List} = emqx_retainer:page_read(<<"retained">>, 1, 10),
{ok, _, List} = emqx_retainer:page_read(<<"retained">>, 1, 10),
?assertEqual(1, length(List)),
?assertMatch(
{ok, [#message{payload = <<"this is a retained message">>}]},
@ -159,7 +159,7 @@ t_store_and_clean(_) ->
),
ok = emqx_retainer:clean(),
{ok, List2} = emqx_retainer:page_read(<<"retained">>, 1, 10),
{ok, _, List2} = emqx_retainer:page_read(<<"retained">>, 1, 10),
?assertEqual(0, length(List2)),
?assertMatch(
{ok, []},
@ -486,12 +486,12 @@ t_clear_expired(_) ->
),
timer:sleep(1000),
{ok, List} = emqx_retainer:page_read(<<"retained/+">>, 1, 10),
{ok, _, List} = emqx_retainer:page_read(<<"retained/+">>, 1, 10),
?assertEqual(5, erlang:length(List)),
timer:sleep(4500),
{ok, List2} = emqx_retainer:page_read(<<"retained/+">>, 1, 10),
{ok, _, List2} = emqx_retainer:page_read(<<"retained/+">>, 1, 10),
?assertEqual(0, erlang:length(List2)),
ok = emqtt:disconnect(C1)
@ -522,7 +522,7 @@ t_max_payload_size(_) ->
),
timer:sleep(500),
{ok, List} = emqx_retainer:page_read(<<"retained/+">>, 1, 10),
{ok, _, List} = emqx_retainer:page_read(<<"retained/+">>, 1, 10),
?assertEqual(1, erlang:length(List)),
ok = emqtt:disconnect(C1)
@ -546,10 +546,10 @@ t_page_read(_) ->
lists:foreach(Fun, lists:seq(1, 9)),
timer:sleep(200),
{ok, List} = emqx_retainer:page_read(<<"retained/+">>, 1, 5),
{ok, _, List} = emqx_retainer:page_read(<<"retained/+">>, 1, 5),
?assertEqual(5, length(List)),
{ok, List2} = emqx_retainer:page_read(<<"retained/+">>, 2, 5),
{ok, _, List2} = emqx_retainer:page_read(<<"retained/+">>, 2, 5),
?assertEqual(4, length(List2)),
ok = emqtt:disconnect(C1).