diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index 15980ce585..b6c17f6413 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -2632,14 +2632,17 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = withStore' (\db -> runExceptT $ getGroupMemberByMemberId db vr user gInfo memId) >>= \case Left _ -> messageError "x.grp.mem.inv error: referenced member does not exist" Right reMember -> do - GroupMemberIntro {introId} <- withStore $ \db -> saveIntroInvitation db reMember m introInv + introId <- withStore $ \db -> do + GroupMemberIntro {introId} <- getIntroduction db reMember m + liftIO $ updateIntroStatus db introId GMIntroInvReceived + pure introId sendGroupMemberMessage gInfo reMember (XGrpMemFwd (memberInfo m) introInv) (Just introId) $ withStore' $ \db -> updateIntroStatus db introId GMIntroInvForwarded _ -> messageError "x.grp.mem.inv can be only sent by invitee member" xGrpMemFwd :: GroupInfo -> GroupMember -> MemberInfo -> IntroInvitation -> CM () - xGrpMemFwd gInfo@GroupInfo {membership, chatSettings} m memInfo@(MemberInfo memId memRole memChatVRange _) introInv@IntroInvitation {groupConnReq, directConnReq} = do + xGrpMemFwd gInfo@GroupInfo {membership, chatSettings} m memInfo@(MemberInfo memId memRole memChatVRange _) IntroInvitation {groupConnReq, directConnReq} = do let GroupMember {memberId = membershipMemId} = membership checkHostRole m memRole toMember <- @@ -2654,7 +2657,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = -- TODO add GSMemIntroInvitedPending, GSMemConnectedPending, etc.? -- TODO keep as is? (GSMemIntroInvited has no purpose) let newMemberStatus = if memberPending toMember then memberStatus toMember else GSMemIntroInvited - withStore' $ \db -> saveMemberInvitation db toMember introInv newMemberStatus + withStore' $ \db -> updateGroupMemberStatus db userId toMember newMemberStatus subMode <- chatReadVar subscriptionMode -- [incognito] send membership incognito profile, create direct connection as incognito let membershipProfile = redactedMemberProfile $ fromLocalProfile $ memberProfile membership diff --git a/src/Simplex/Chat/Store/Groups.hs b/src/Simplex/Chat/Store/Groups.hs index 59c35b4cdb..720d9f50d9 100644 --- a/src/Simplex/Chat/Store/Groups.hs +++ b/src/Simplex/Chat/Store/Groups.hs @@ -98,7 +98,6 @@ module Simplex.Chat.Store.Groups updateGroupMemberRole, createIntroductions, updateIntroStatus, - saveIntroInvitation, getIntroduction, getIntroducedGroupMemberIds, getForwardIntroducedMembers, @@ -108,7 +107,6 @@ module Simplex.Chat.Store.Groups getForwardScopeMember, createIntroReMember, createIntroToMemberContact, - saveMemberInvitation, getMatchingContacts, getMatchingMembers, getMatchingMemberContacts, @@ -1542,7 +1540,7 @@ createIntroductions db chatV members toMember = do |] (groupMemberId' reMember, groupMemberId' toMember, GMIntroPending, chatV, ts, ts) introId <- insertedRowId db - pure $ Just GroupMemberIntro {introId, reMember, toMember, introStatus = GMIntroPending, introInvitation = Nothing} + pure $ Just GroupMemberIntro {introId, reMember, toMember, introStatus = GMIntroPending} where checkInverseIntro :: IO (Maybe Int64) checkInverseIntro = @@ -1564,56 +1562,21 @@ updateIntroStatus db introId introStatus = do |] (introStatus, currentTs, introId) -saveIntroInvitation :: DB.Connection -> GroupMember -> GroupMember -> IntroInvitation -> ExceptT StoreError IO GroupMemberIntro -saveIntroInvitation db reMember toMember introInv@IntroInvitation {groupConnReq} = do - intro <- getIntroduction db reMember toMember - liftIO $ do - currentTs <- getCurrentTime - DB.execute - db - [sql| - UPDATE group_member_intros - SET intro_status = ?, - group_queue_info = ?, - direct_queue_info = ?, - updated_at = ? - WHERE group_member_intro_id = ? - |] - (GMIntroInvReceived, groupConnReq, directConnReq introInv, currentTs, introId intro) - pure intro {introInvitation = Just introInv, introStatus = GMIntroInvReceived} - -saveMemberInvitation :: DB.Connection -> GroupMember -> IntroInvitation -> GroupMemberStatus -> IO () -saveMemberInvitation db GroupMember {groupMemberId} IntroInvitation {groupConnReq, directConnReq} newMemberStatus = do - currentTs <- getCurrentTime - DB.execute - db - [sql| - UPDATE group_members - SET member_status = ?, - group_queue_info = ?, - direct_queue_info = ?, - updated_at = ? - WHERE group_member_id = ? - |] - (newMemberStatus, groupConnReq, directConnReq, currentTs, groupMemberId) - getIntroduction :: DB.Connection -> GroupMember -> GroupMember -> ExceptT StoreError IO GroupMemberIntro -getIntroduction db reMember toMember = ExceptT $ do - toIntro - <$> DB.query +getIntroduction db reMember toMember = ExceptT $ + firstRow toIntro SEIntroNotFound $ + DB.query db [sql| - SELECT group_member_intro_id, group_queue_info, direct_queue_info, intro_status + SELECT group_member_intro_id, intro_status FROM group_member_intros WHERE re_group_member_id = ? AND to_group_member_id = ? |] (groupMemberId' reMember, groupMemberId' toMember) where - toIntro :: [(Int64, Maybe ConnReqInvitation, Maybe ConnReqInvitation, GroupMemberIntroStatus)] -> Either StoreError GroupMemberIntro - toIntro [(introId, groupConnReq, directConnReq, introStatus)] = - let introInvitation = IntroInvitation <$> groupConnReq <*> pure directConnReq - in Right GroupMemberIntro {introId, reMember, toMember, introStatus, introInvitation} - toIntro _ = Left SEIntroNotFound + toIntro :: (Int64, GroupMemberIntroStatus) -> GroupMemberIntro + toIntro (introId, introStatus) = + GroupMemberIntro {introId, reMember, toMember, introStatus} getIntroducedGroupMemberIds :: DB.Connection -> GroupMember -> IO [GroupMemberId] getIntroducedGroupMemberIds db invitee = diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index be8e7fe244..0b8a53ff3f 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -3514,7 +3514,7 @@ Plan: SEARCH chat_item_reactions USING INDEX idx_chat_item_reactions_group (group_id=? AND shared_msg_id=?) Query: - SELECT group_member_intro_id, group_queue_info, direct_queue_info, intro_status + SELECT group_member_intro_id, intro_status FROM group_member_intros WHERE re_group_member_id = ? AND to_group_member_id = ? @@ -3809,17 +3809,6 @@ SEARCH connections USING INDEX idx_connections_group_member_id (group_member_id= LIST SUBQUERY 1 SCAN group_members USING COVERING INDEX idx_group_members_user_id_local_display_name -Query: - UPDATE group_member_intros - SET intro_status = ?, - group_queue_info = ?, - direct_queue_info = ?, - updated_at = ? - WHERE group_member_intro_id = ? - -Plan: -SEARCH group_member_intros USING INTEGER PRIMARY KEY (rowid=?) - Query: UPDATE group_member_intros SET intro_status='fwd' WHERE re_group_member_id IN (SELECT group_member_id FROM group_members WHERE local_display_name = ?) @@ -4798,17 +4787,6 @@ Query: Plan: SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) -Query: - UPDATE group_members - SET member_status = ?, - group_queue_info = ?, - direct_queue_info = ?, - updated_at = ? - WHERE group_member_id = ? - -Plan: -SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) - Query: UPDATE group_members SET member_status = ?, member_role = ?, updated_at = ? diff --git a/src/Simplex/Chat/Types.hs b/src/Simplex/Chat/Types.hs index bdcf3f0bfb..0b1571eec2 100644 --- a/src/Simplex/Chat/Types.hs +++ b/src/Simplex/Chat/Types.hs @@ -1764,8 +1764,7 @@ data GroupMemberIntro = GroupMemberIntro { introId :: Int64, reMember :: GroupMember, toMember :: GroupMember, - introStatus :: GroupMemberIntroStatus, - introInvitation :: Maybe IntroInvitation + introStatus :: GroupMemberIntroStatus } deriving (Show)