From 5188015bfd924762a785937cfa9b51c2ec17aa8a Mon Sep 17 00:00:00 2001 From: gspasov Date: Wed, 24 Apr 2019 16:49:04 +0300 Subject: [PATCH] Added members and admins to Room info, refactored some code --- apps/roster/src/protocol/roster_link.erl | 95 +++++++++++++----------- apps/roster/src/test/room_test.erl | 28 +++---- 2 files changed, 66 insertions(+), 57 deletions(-) diff --git a/apps/roster/src/protocol/roster_link.erl b/apps/roster/src/protocol/roster_link.erl index 87f933d54..7026023f7 100644 --- a/apps/roster/src/protocol/roster_link.erl +++ b/apps/roster/src/protocol/roster_link.erl @@ -16,32 +16,35 @@ info(#'Link'{id = LinkId, type = group, status = join = LStatus} = RequestData, Req, #cx{params = ClientId} = State) when LinkId /= [] -> roster:info(?MODULE, "~p:Link/~p:~p", [ClientId, LStatus, RequestData]), Res = case get_room_by_link_id(LinkId) of - #ok{code = #'Room'{id = RoomId} = Room} -> - #'Member'{id = MemberId, reader = MemberReader} = - Member = build_membership_card(ClientId, RoomId), + {ok, #'Room'{id = RoomId} = Room} -> + Member = #'Member'{id = MemberId, reader = MemberReader} = build_membership_card(ClientId, RoomId), Messages = member_last_messages(Member), {UnreadMsg, LastMsg, _} = roster:unread_msg({'Message', Messages}, MemberReader, MemberId), {#'Member'{}, [], #'Room'{} = Room1} = roster:add_member(Room, Member, {no_muc_message, Room#'Room'.readers}), - {As, Ms} = roster:split_members(roster:members(#muc{name = Room1#'Room'.id}, presence)), - #'Room'{} = Room2 = roster:reader_cache(Room1#'Room'{status = join, last_msg = LastMsg, unread = UnreadMsg, members = Ms, admins = As}), - ok_code(Room2); - #error{code = not_found} = Err -> Err + {Admins, Members} = roster:split_members(roster:members(#muc{name = Room1#'Room'.id}, presence)), + roster:reader_cache(Room1#'Room'{status = join, last_msg = LastMsg, unread = UnreadMsg, members = Members, admins = Admins}); + {error, not_found} = Err -> #io{code = Err} end, roster:info(?MODULE, "Link/~p.Response:~p", [Res, LStatus]), {reply, {bert, Res}, Req, State}; +%% NOTE - Not used at the moment, to be finished in next release +% info(#'Link'{id = LinkId, name = RoomId, type = group, status = update = LStatus} = RequestData, Req, #cx{params = ClientId} = State) when RoomId /= [], LinkId /= [] -> roster:info(?MODULE, "~p:Link/~p:~p", [ClientId, LStatus, RequestData]), Res = case roster:muc_member(ClientId, RoomId) of - #'Member'{status = Status} when - Status == owner; Status == admin -> - update_link(RoomId, RequestData); + #'Member'{status = Status} when Status == owner; Status == admin -> + case update_link(RoomId, RequestData) of + {error, invalid_data} = E -> #io{code = E}; + {error, not_found} = E -> #io{code = E}; + NewLink -> NewLink + end; #'Member'{status = member} -> - error_code(permission_denied); + #io{code = #error{code = permission_denied}}; _ -> - error_code(invalid_data) + #io{code = #error{code = invalid_data}} end, roster:info(?MODULE, "Link/~p.Response:~p", [Res, LStatus]), {reply, {bert, Res}, Req, State}; @@ -50,24 +53,27 @@ info(#'Link'{id = LinkId, type = group, status = get = LStatus} = RequestData, Req, #cx{params = ClientId} = State) when LinkId /= [] -> roster:info(?MODULE, "~p:Link/~p:~p", [ClientId, LStatus, RequestData]), Res = case get_room_by_link_id(LinkId) of - #ok{code = #'Room'{} = Room} -> - #ok{code = Room#'Room'{status = info}}; - #error{code = not_found} = Err -> Err + {ok, #'Room'{id = RoomId} = Room} -> + {Admins, Members} = roster:split_members(roster:members(#muc{name = RoomId}, presence)), + Room#'Room'{status = info, admins = Admins, members = Members}; + {error, not_found} = Err -> #io{code = Err} end, roster:info(?MODULE, "Link/~p.Response:~p", [Res, LStatus]), {reply, {bert, Res}, Req, State}; +%% NOTE - Not used at the moment, to be finished in next release +% info(#'Link'{type = group, status = delete = LStatus} = RequestData, Req, #cx{params = ClientId} = State) -> roster:info(?MODULE, "~p:Link/~p:~p", [ClientId, LStatus, RequestData]), % Res = delete_link(ClientId, RequestData), - Res = error_code(permission_denied), + Res = #io{code = #error{code = permission_denied}}, roster:info(?MODULE, "Link/~p.Response:~p", [Res, LStatus]), {reply, {bert, Res}, Req, State}; info(#'Link'{} = RequestData, Req, #cx{params = ClientId} = State) -> roster:info(?MODULE, "~p:Link/unknown:~p", [ClientId, RequestData]), - {reply, {bert, io_error(invalid_data)}, Req, State}. + {reply, {bert, #io{code = #error{code = invalid_data}}}, Req, State}. % ====================================== % Helper functions @@ -76,23 +82,24 @@ info(#'Link'{} = RequestData, Req, #cx{params = ClientId} = State) -> gen_link(RoomId) -> TmpLinkId = hash(RoomId), LinkId = case kvs:get('Link', TmpLinkId) of - #ok{code = #'Link'{id = TmpLinkId}} -> gen_link(RoomId); - #error{code = not_found} -> TmpLinkId + {ok, #'Link'{id = TmpLinkId}} -> gen_link(RoomId); + {error, not_found} -> TmpLinkId end, #'Link'{ - % id = <>, id = LinkId, name = RoomId, type = group, status = get }. +%% NOTE - Not used at the moment, to be finished in next release +% update_link(#'Link'{name = RoomId} = Link) -> update_link(RoomId, Link). update_link(RoomId, #'Link'{id = LinkId}) -> case kvs:get('Room', RoomId) of - #ok{code = #'Room'{links = Links0} = Room} -> + {ok, #'Room'{links = Links0} = Room} -> % remove case statement for multiple links case keymember(LinkId, #'Link'.id, Links0) of true -> @@ -101,32 +108,32 @@ update_link(RoomId, #'Link'{id = LinkId}) -> ok = kvs:put(Room#'Room'{links = Links1}), ok = kvs:delete('Link', LinkId), ok = kvs:put(NewLink), - ok_code(NewLink); - false -> #error{code = invalid_data} + NewLink; + false -> {error, invalid_data} end; - #error{code = not_found} = Err -> Err + {error, not_found} = Err -> Err end. +%% NOTE - Not used at the moment, to be finished in next release +% delete_link(ClientId, #'Link'{id = LinkId, name = RoomId}) -> map( - fun(#'Member'{status = member}) -> - error_code(permission_denied); - (#'Member'{status = Status}) when - Status == owner; Status == admin -> + fun + (#'Member'{status = member}) -> {error, permission_denied}; + (#'Member'{status = Status}) when Status == owner; Status == admin -> case kvs:get('Room', RoomId) of - #ok{code = #'Room'{id = RoomId, links = Links} = Room} -> + {ok, #'Room'{id = RoomId, links = Links} = Room} -> ok = kvs:put(Room#'Room'{links = keydelete(LinkId, #'Link'.id, Links)}), ok = kvs:delete('Link', LinkId); - #error{code = not_found} = Err -> Err + {error, not_found} = Err -> Err end; - (_) -> error_code(invalid_data) + (_) -> {error, invalid_data} end, roster:muc_member(ClientId, RoomId)). purge_room_links(RoomId) -> %% TODO: Improve error handling case kvs:get('Room', RoomId) of - #ok{code = #'Room'{links = Links}} when - is_list(Links), Links /= [] -> + {ok, #'Room'{links = Links}} when is_list(Links), Links /= [] -> [kvs:delete('Link', Lid) || #'Link'{id = Lid, name = RoomId} <- Links]; _ -> [] end, @@ -140,12 +147,12 @@ get_room_by_link_id(<>) -> get_room_by_link_id(LinkId); get_room_by_link_id(Id) -> case kvs:get('Link', Id) of - #ok{code = #'Link'{name = RoomId}} -> + {ok, #'Link'{name = RoomId}} -> case kvs:get('Room', RoomId) of - #ok{code = #'Room'{}} = Ok -> Ok; - #error{code = not_found} = Err -> Err + {ok, #'Room'{}} = Ok -> Ok; + {error, not_found} = Err -> Err end; - #error{code = not_found} = Err -> Err + {error, not_found} = Err -> Err end. build_membership_card(ClientId, RoomId) -> @@ -159,7 +166,7 @@ build_membership_card(ClientId, RoomId) -> reader = 0, update = 0, presence = roster:is_online(PhoneID), status = member}, - #ok{code = Member1} = roster:to_member(PhoneID), + {ok, Member1} = roster:to_member(PhoneID), roster:patch_member(Member0, Member1) end. @@ -169,10 +176,12 @@ member_last_messages(Member) -> {_, LM} -> LM end. -ok_code(Payload) -> #ok{code = Payload}. -error_code(Payload) -> #error{code = Payload}. +%% Unused +% +% ok_code(Payload) -> #ok{code = Payload}. +% error_code(Payload) -> #error{code = Payload}. -io_ok(Payload) -> io_code(ok_code(Payload)). -io_error(Payload) -> io_code(error_code(Payload)). +% io_ok(Payload) -> io_code(ok_code(Payload)). +% io_error(Payload) -> io_code(error_code(Payload)). -io_code(Payload) -> #io{code = Payload}. +% io_code(Payload) -> #io{code = Payload}. diff --git a/apps/roster/src/test/room_test.erl b/apps/roster/src/test/room_test.erl index 96f1a2de5..96cc66ff0 100644 --- a/apps/roster/src/test/room_test.erl +++ b/apps/roster/src/test/room_test.erl @@ -127,10 +127,10 @@ link() -> %% Get the room link by RoomId #ok{code = #'Room'{links = [#'Link'{id = LinkId}]}} = kvs:get('Room', Room), %% Assert linkId by Link get request - #ok{code = #'Room'{links = [#'Link'{id = LinkId}], readers = [_ | _]}} = + #'Room'{links = [#'Link'{id = LinkId}], readers = [_ | _]} = roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, type = group, status = get}), %% Update the link from the administrator and compare it with the old one. - #ok{code = #'Link'{id = LinkId}} /= roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, name = Room, type = group, status = update}), + #'Link'{id = LinkId} /= roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, name = Room, type = group, status = update}), %%add member with message size roster:purge_user(FPhone = <<"6789000">>), {FClientId, FToken} = roster_client:reg_fake_user(FPhone), @@ -220,38 +220,38 @@ test_joinlink() -> %%% Start tests: %% Test: try to get room info; fake room link; admin - {error, not_found} = roster_client:send_receive(BClientId, 1, Link#'Link'{id = ?BLANK_LINK, status = get}), + #io{code = #error{code = not_found}} = roster_client:send_receive(BClientId, 1, Link#'Link'{id = ?BLANK_LINK, status = get}), %% Test: try to get room info; correct room link; admin - {ok, #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], status = info}} = + #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], status = info} = roster_client:send_receive(BClientId, 1, Link#'Link'{status = get}), %% Test: try to get room info; correct room link; not room member - {ok, #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], status = info}} = + #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], status = info} = roster_client:send_receive(DClientId, 1, Link#'Link'{status = get}), %% Test: join room - {ok, #'Room'{id = RoomId, status = join} = Room1} = + #'Room'{id = RoomId, status = join} = Room1 = roster_client:send_receive(DClientId, 1, Link#'Link'{status = join}), % Check if new member is added true = lists:keymember(DPhoneId, #'Member'.phone_id, Room1#'Room'.members), %% Test: try to update room link; room member, non admin - {error, permission_denied} = roster_client:send_receive(DClientId, 1, Link#'Link'{status = update}), + #io{code = #error{code = permission_denied}} = roster_client:send_receive(DClientId, 1, Link#'Link'{status = update}), %% Test: try to update room link; non room member, non admin, fake link - {error, invalid_data} = roster_client:send_receive(EClientId, 1, Link#'Link'{id = ?BLANK_LINK, status = update}), + #io{code = #error{code = invalid_data}} = roster_client:send_receive(EClientId, 1, Link#'Link'{id = ?BLANK_LINK, status = update}), %% Test: try to update room link; non room member - {error, invalid_data} = roster_client:send_receive(EClientId, 1, Link#'Link'{status = update}), + #io{code = #error{code = invalid_data}} = roster_client:send_receive(EClientId, 1, Link#'Link'{status = update}), %% Test: try to update room link; room member, admin - {ok, #'Link'{name = RoomId} = Link1} = roster_client:send_receive(BClientId, 1, Link#'Link'{status = update}), + #'Link'{name = RoomId} = Link1 = roster_client:send_receive(BClientId, 1, Link#'Link'{status = update}), %% Test: try to get room info; correct room link; - {ok, #'Room'{id = RoomId, links = [Link1], status = info}} = + #'Room'{id = RoomId, links = [Link1], status = info} = roster_client:send_receive(EClientId, 1, Link1#'Link'{status = get}), %% Test: try to update room link; non-existent link, room member, admin - {error, invalid_data} = roster_client:send_receive(BClientId, 1, Link#'Link'{status = update}), + #io{code = #error{code = invalid_data}} = roster_client:send_receive(BClientId, 1, Link#'Link'{status = update}), %% Test: join room; non-existent link, non room member - {error, not_found} = roster_client:send_receive(EClientId, 1, Link#'Link'{status = join}), + #io{code = #error{code = not_found}} = roster_client:send_receive(EClientId, 1, Link#'Link'{status = join}), %% Test: join room; non room member - {ok, #'Room'{id = RoomId, links = [Link1], status = join} = Room2} = + #'Room'{id = RoomId, links = [Link1], status = join} = Room2 = roster_client:send_receive(EClientId, 1, Link1#'Link'{status = join}), % Check if new member is added true = lists:keymember(EPhoneId, #'Member'.phone_id, Room2#'Room'.members), -- GitLab