From 4aefe268291e1b98d8ac1c9b79955b99dc8ab580 Mon Sep 17 00:00:00 2001 From: Hans Svensson Date: Mon, 8 Jun 2020 15:04:52 +0200 Subject: [PATCH 1/2] Send old star when re-starring a message --- apps/roster/src/protocol/roster_favorite.erl | 25 +++++++++++--------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/roster/src/protocol/roster_favorite.erl b/apps/roster/src/protocol/roster_favorite.erl index 80a657812..671c566b5 100644 --- a/apps/roster/src/protocol/roster_favorite.erl +++ b/apps/roster/src/protocol/roster_favorite.erl @@ -35,17 +35,20 @@ info(#'Star'{status = add, message = #'Message'{id = MsgId}} = Data, Req, #cx{pa {ok, Msg} -> case kvs:get('Roster', RosterId) of {ok, #'Roster'{favorite = StFavMsgs} = Roster} -> - case lists:member(MsgId, [roster:star_msg_id(M) || #'Star'{message = M} <- StFavMsgs]) of - false -> - UpdData = Data#'Star'{roster_id = RosterId, message = MsgId, id = kvs:next_id('Star', 1)}, - UpdFavMsgs = StFavMsgs ++ [UpdData], - kvs:put(Roster#'Roster'{favorite = UpdFavMsgs, update = roster:now_msec(), status = update}), - roster:send_ses(C, roster:phone(PhoneId), UpdData#'Star'{message = Msg}), - <<>>; - _ -> - <<>> - end; - #error{} -> #io{code = #error{code = roster_not_found}} + Star = + case [S || S = #'Star'{message = M} <- StFavMsgs, roster:star_msg_id(M) == MsgId] of + [] -> + UpdData = Data#'Star'{roster_id = RosterId, message = MsgId, id = kvs:next_id('Star', 1)}, + UpdFavMsgs = StFavMsgs ++ [UpdData], + kvs:put(Roster#'Roster'{favorite = UpdFavMsgs, update = roster:now_msec(), status = update}), + UpdData; + [ExistingStar | _] -> + ExistingStar + end, + roster:send_ses(C, roster:phone(PhoneId), Star#'Star'{message = Msg}), + <<>>; + #error{} -> + #io{code = #error{code = roster_not_found}} end; #error{} -> #io{code = #error{code = message_not_found}} -- GitLab From 2d9db284e4def2b1b4a0e14b99dcaabd4fd100cf Mon Sep 17 00:00:00 2001 From: Hans Svensson Date: Mon, 8 Jun 2020 15:05:34 +0200 Subject: [PATCH 2/2] Model update for add_star --- eqc/server_eqc.erl | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/eqc/server_eqc.erl b/eqc/server_eqc.erl index e3520be4a..2479a2fc3 100644 --- a/eqc/server_eqc.erl +++ b/eqc/server_eqc.erl @@ -356,9 +356,12 @@ delete_star(Phone, StarId, S) -> U#user{ stars = lists:keydelete(StarId, 1, Stars) } end). -is_starred_msg(S, Phone, MsgId) -> +star_id(S, Phone, MsgId) -> #user{ stars = Stars } = get_user(S, Phone), - lists:keymember(MsgId, 2, Stars). + case lists:keyfind(MsgId, 2, Stars) of + false -> false; + {StarId, _} -> StarId + end. starred_msg(S, Phone, StarId) -> #user{ stars = Stars } = get_user(S, Phone), @@ -775,12 +778,13 @@ add_star(Handle, MsgId) -> add_star_callouts(S, [Handle, MsgId]) -> Phone = client_phone(S, Handle), - IsStarred = is_starred_msg(S, Phone, MsgId), + StarId = star_id(S, Phone, MsgId), ?PAR([ ?CALLOUTS( - ?MATCH({StarId, ok}, ?star(Handle, ?VAR, '_', MsgId, add)), - ?APPLY(do_add_star, [Phone, StarId, MsgId]) ) || not IsStarred ] ++ - [ ?star(H1, '_', '_', MsgId, add) || H1 <- get_clients(S, Phone), H1 /= Handle, not IsStarred ] - ). + ?MATCH({NewStarId, ok}, ?star(Handle, ?VAR, '_', MsgId, add)), + ?APPLY(do_add_star, [Phone, NewStarId, MsgId]) ) || StarId == false ] ++ + [ ?star(H1, '_', '_', MsgId, add) || H1 <- get_clients(S, Phone), H1 /= Handle, StarId == false ] ++ + [ ?star(H1, StarId, '_', MsgId, add) || H1 <- get_clients(S, Phone), StarId /= false ] + ). do_add_star_next(S, _, [Phone, StarId, MsgId]) -> add_star(Phone, StarId, MsgId, S). -- GitLab