From 13e792534801a77d9cb46850237cdd779e9f9a80 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Thu, 4 Aug 2022 18:39:31 +0100 Subject: [PATCH] core: fully remove invited member (#901) * core: fully remove invited member * deleteMemberConnection --- src/Simplex/Chat.hs | 18 +++++++++++------- src/Simplex/Chat/Store.hs | 10 ++++++++-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 9377a133bc..2479ab73dc 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -752,12 +752,16 @@ processChatCommand = \case canRemove = userRole >= GRAdmin && userRole >= mRole && memberCurrent membership unless canRemove $ throwChatError CEGroupUserRole withChatLock . procCmd $ do - when (mStatus /= GSMemInvited) $ do - msg <- sendGroupMessage gInfo members $ XGrpMemDel mId - ci <- saveSndChatItem user (CDGroupSnd gInfo) msg (CISndGroupEvent $ SGEMemberDeleted memberId memberProfile) Nothing Nothing - toView . CRNewChatItem $ AChatItem SCTGroup SMDSnd (GroupChat gInfo) ci - deleteMemberConnection m - withStore' $ \db -> updateGroupMemberStatus db userId m GSMemRemoved + case mStatus of + GSMemInvited -> do + deleteMemberConnection m + withStore' $ \db -> deleteGroupMember db user m + _ -> do + msg <- sendGroupMessage gInfo members $ XGrpMemDel mId + ci <- saveSndChatItem user (CDGroupSnd gInfo) msg (CISndGroupEvent $ SGEMemberDeleted memberId memberProfile) Nothing Nothing + toView . CRNewChatItem $ AChatItem SCTGroup SMDSnd (GroupChat gInfo) ci + deleteMemberConnection m + withStore' $ \db -> updateGroupMemberStatus db userId m GSMemRemoved pure $ CRUserDeletedMember gInfo m {memberStatus = GSMemRemoved} APILeaveGroup groupId -> withUser $ \user@User {userId} -> do Group gInfo@GroupInfo {membership} members <- withStore $ \db -> getGroup db user groupId @@ -1745,7 +1749,7 @@ processAgentMessage (Just user@User {userId, profile}) agentConnId agentMessage then do updCi <- withStore $ \db -> updateGroupChatItem db user groupId itemId (CIRcvMsgContent mc) msgId toView . CRChatItemUpdated $ AChatItem SCTGroup SMDRcv (GroupChat gInfo) updCi - let g = groupName' gInfo + let g = groupName' gInfo setActive $ ActiveG g else messageError "x.msg.update: group member attempted to update a message of another member" (SMDSnd, _) -> messageError "x.msg.update: group member attempted invalid message update" diff --git a/src/Simplex/Chat/Store.hs b/src/Simplex/Chat/Store.hs index 7610d1dd8c..69fbb90511 100644 --- a/src/Simplex/Chat/Store.hs +++ b/src/Simplex/Chat/Store.hs @@ -81,6 +81,7 @@ module Simplex.Chat.Store createMemberConnection, updateGroupMemberStatus, createNewGroupMember, + deleteGroupMember, deleteGroupMemberConnection, createIntroductions, updateIntroStatus, @@ -1585,8 +1586,13 @@ createNewMember_ groupMemberId <- insertedRowId db pure GroupMember {..} -deleteGroupMemberConnection :: DB.Connection -> UserId -> GroupMember -> IO () -deleteGroupMemberConnection db userId GroupMember {groupMemberId} = +deleteGroupMember :: DB.Connection -> User -> GroupMember -> IO () +deleteGroupMember db user@User {userId} m@GroupMember {groupMemberId} = do + deleteGroupMemberConnection db user m + DB.execute db "DELETE FROM group_members WHERE user_id = ? AND group_member_id = ?" (userId, groupMemberId) + +deleteGroupMemberConnection :: DB.Connection -> User -> GroupMember -> IO () +deleteGroupMemberConnection db User {userId} GroupMember {groupMemberId} = DB.execute db "DELETE FROM connections WHERE user_id = ? AND group_member_id = ?" (userId, groupMemberId) createIntroductions :: DB.Connection -> [GroupMember] -> GroupMember -> IO [GroupMemberIntro]