fix: create new tombstone in chats_contacts if the row does not exist

Otherwise new members do not see past members
even if they receive info about them in every message.
This commit is contained in:
link2xt
2025-01-12 00:18:18 +00:00
parent 5dc8788eab
commit 187274d7b7
2 changed files with 39 additions and 5 deletions

View File

@@ -7808,4 +7808,36 @@ mod tests {
Ok(())
}
/// Test that tombstones for past members are added to chats_contacts table
/// even if the row did not exist before.
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn test_past_members() -> Result<()> {
let mut tcm = TestContextManager::new();
let alice = &tcm.alice().await;
let alice_fiona_contact_id = Contact::create(alice, "Fiona", "fiona@example.net").await?;
let alice_chat_id =
create_group_chat(alice, ProtectionStatus::Unprotected, "Group chat").await?;
add_contact_to_chat(alice, alice_chat_id, alice_fiona_contact_id).await?;
alice
.send_text(alice_chat_id, "Hi! I created a group.")
.await;
remove_contact_from_chat(alice, alice_chat_id, alice_fiona_contact_id).await?;
assert_eq!(get_past_chat_contacts(alice, alice_chat_id).await?.len(), 1);
let bob = &tcm.bob().await;
let bob_addr = bob.get_config(Config::Addr).await?.unwrap();
let alice_bob_contact_id = Contact::create(alice, "Bob", &bob_addr).await?;
add_contact_to_chat(alice, alice_chat_id, alice_bob_contact_id).await?;
let add_message = alice.pop_sent_msg().await;
let bob_add_message = bob.recv_msg(&add_message).await;
let bob_chat_id = bob_add_message.chat_id;
assert_eq!(get_chat_contacts(bob, bob_chat_id).await?.len(), 2);
assert_eq!(get_past_chat_contacts(bob, bob_chat_id).await?.len(), 1);
Ok(())
}
}

View File

@@ -2161,10 +2161,12 @@ async fn update_chats_contacts_timestamps(
}
let mut remove_statement = transaction.prepare(
"UPDATE chats_contacts
SET remove_timestamp=?1
WHERE chat_id=?2 AND contact_id=?3
AND ?1>remove_timestamp AND ?1>add_timestamp",
"INSERT INTO chats_contacts (chat_id, contact_id, remove_timestamp)
VALUES (?1, ?2, ?3)
ON CONFLICT (chat_id, contact_id)
DO
UPDATE SET remove_timestamp=?3
WHERE ?3>remove_timestamp AND ?3>add_timestamp",
)?;
for (contact_id, ts) in iter::zip(
@@ -2174,7 +2176,7 @@ async fn update_chats_contacts_timestamps(
// It could be that member was already removed,
// but updated removal timestamp
// is also a modification worth notifying about.
modified |= remove_statement.execute((ts, chat_id, contact_id))? > 0;
modified |= remove_statement.execute((chat_id, contact_id, ts))? > 0;
}
Ok(())