core: associate new contact with all corresponding members on member contact re-creation (e.g. after it was merged to many members and then deleted) (#5028)

This commit is contained in:
spaced4ndy 2024-10-11 23:47:54 +04:00 committed by GitHub
parent aa2eafdacb
commit e76dc33cf0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 73 additions and 5 deletions

View file

@ -1933,8 +1933,8 @@ createMemberContact
contactId <- insertedRowId db contactId <- insertedRowId db
DB.execute DB.execute
db db
"UPDATE group_members SET contact_id = ?, updated_at = ? WHERE group_member_id = ?" "UPDATE group_members SET contact_id = ?, updated_at = ? WHERE contact_profile_id = ?"
(contactId, currentTs, groupMemberId) (contactId, currentTs, memberContactProfileId)
DB.execute DB.execute
db db
[sql| [sql|
@ -2003,7 +2003,7 @@ createMemberContactInvited
user@User {userId, profile = LocalProfile {preferences}} user@User {userId, profile = LocalProfile {preferences}}
connIds connIds
gInfo gInfo
m@GroupMember {groupMemberId, localDisplayName = memberLDN, memberProfile, memberContactProfileId} m@GroupMember {localDisplayName = memberLDN, memberProfile, memberContactProfileId}
mConn mConn
subMode = do subMode = do
currentTs <- liftIO getCurrentTime currentTs <- liftIO getCurrentTime
@ -2031,8 +2031,8 @@ createMemberContactInvited
contactId <- insertedRowId db contactId <- insertedRowId db
DB.execute DB.execute
db db
"UPDATE group_members SET contact_id = ?, updated_at = ? WHERE group_member_id = ?" "UPDATE group_members SET contact_id = ?, updated_at = ? WHERE contact_profile_id = ?"
(contactId, currentTs, groupMemberId) (contactId, currentTs, memberContactProfileId)
pure contactId pure contactId
updateMemberContactInvited :: DB.Connection -> User -> (CommandId, ConnId) -> GroupInfo -> Connection -> Contact -> SubscriptionMode -> ExceptT StoreError IO Contact updateMemberContactInvited :: DB.Connection -> User -> (CommandId, ConnId) -> GroupInfo -> Connection -> Contact -> SubscriptionMode -> ExceptT StoreError IO Contact

View file

@ -130,6 +130,7 @@ chatGroupTests = do
it "invited member replaces member contact reference if it already exists" testMemberContactInvitedConnectionReplaced it "invited member replaces member contact reference if it already exists" testMemberContactInvitedConnectionReplaced
it "share incognito profile" testMemberContactIncognito it "share incognito profile" testMemberContactIncognito
it "sends and updates profile when creating contact" testMemberContactProfileUpdate it "sends and updates profile when creating contact" testMemberContactProfileUpdate
it "re-create member contact after deletion, many groups" testRecreateMemberContactManyGroups
describe "group message forwarding" $ do describe "group message forwarding" $ do
it "forward messages between invitee and introduced (x.msg.new)" testGroupMsgForward it "forward messages between invitee and introduced (x.msg.new)" testGroupMsgForward
it "deduplicate forwarded messages" testGroupMsgForwardDeduplicate it "deduplicate forwarded messages" testGroupMsgForwardDeduplicate
@ -4537,6 +4538,73 @@ testMemberContactProfileUpdate =
alice <# "#team kate> hello there" alice <# "#team kate> hello there"
bob <# "#team kate> hello there" -- updated profile bob <# "#team kate> hello there" -- updated profile
testRecreateMemberContactManyGroups :: HasCallStack => FilePath -> IO ()
testRecreateMemberContactManyGroups =
testChat2 aliceProfile bobProfile $
\alice bob -> do
connectUsers alice bob
createGroup2' "team" alice bob False
createGroup2' "club" alice bob False
-- alice can message bob via team and via club
alice ##> "@#team bob 1"
alice <# "@bob 1"
bob <# "alice> 1"
bob ##> "@#team alice 2"
bob <# "@alice 2"
alice <# "bob> 2"
alice ##> "@#club bob 3"
alice <# "@bob 3"
bob <# "alice> 3"
bob ##> "@#club alice 4"
bob <# "@alice 4"
alice <# "bob> 4"
-- alice deletes contact with bob
alice ##> "/d bob"
alice <## "bob: contact is deleted"
bob <## "alice (Alice) deleted contact with you"
bob ##> "/d alice"
bob <## "alice: contact is deleted"
-- alice creates member contact with bob
alice ##> "@#team bob hi"
alice
<### [ "member #team bob does not have direct connection, creating",
"contact for member #team bob is created",
"sent invitation to connect directly to member #team bob",
WithTime "@bob hi"
]
bob
<### [ "#team alice is creating direct contact alice with you",
WithTime "alice> hi"
]
bob <## "alice (Alice): you can send messages to contact"
concurrently_
(alice <## "bob (Bob): contact is connected")
(bob <## "alice (Alice): contact is connected")
-- alice can message bob via team and via club
alice ##> "@#team bob 1"
alice <# "@bob 1"
bob <# "alice> 1"
bob ##> "@#team alice 2"
bob <# "@alice 2"
alice <# "bob> 2"
alice ##> "@#club bob 3"
alice <# "@bob 3"
bob <# "alice> 3"
bob ##> "@#club alice 4"
bob <# "@alice 4"
alice <# "bob> 4"
testGroupMsgForward :: HasCallStack => FilePath -> IO () testGroupMsgForward :: HasCallStack => FilePath -> IO ()
testGroupMsgForward = testGroupMsgForward =
testChat3 aliceProfile bobProfile cathProfile $ testChat3 aliceProfile bobProfile cathProfile $