Compare commits

...

1 Commits

Author SHA1 Message Date
iequidoo
5a5f2c5864 fix: Emit WebxdcInstanceDeleted events when deleting a chat (#6670) 2025-03-31 22:42:58 -03:00
2 changed files with 41 additions and 2 deletions

View File

@@ -801,9 +801,14 @@ impl ChatId {
Sync => chat.get_sync_id(context).await?,
};
context
let webxdc_ids = context
.sql
.transaction(|transaction| {
let mut stmt = transaction.prepare("SELECT id FROM msgs WHERE chat_id=? AND type=?")?;
let mut webxdc_ids = Vec::new();
for id in stmt.query_map((self, Viewtype::Webxdc), |row| row.get(0))? {
webxdc_ids.push(id?);
}
transaction.execute(
"UPDATE imap SET target=? WHERE rfc724_mid IN (SELECT rfc724_mid FROM msgs WHERE chat_id=?)",
(delete_msgs_target, self,),
@@ -819,10 +824,13 @@ impl ChatId {
transaction.execute("DELETE FROM msgs WHERE chat_id=?", (self,))?;
transaction.execute("DELETE FROM chats_contacts WHERE chat_id=?", (self,))?;
transaction.execute("DELETE FROM chats WHERE id=?", (self,))?;
Ok(())
Ok(webxdc_ids)
})
.await?;
for msg_id in webxdc_ids {
context.emit_event(EventType::WebxdcInstanceDeleted { msg_id });
}
context.emit_event(EventType::ChatDeleted { chat_id: self });
context.emit_msgs_changed_without_ids();

View File

@@ -1790,6 +1790,37 @@ async fn test_webxdc_delete_event() -> Result<()> {
Ok(())
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn test_chat_delete() -> Result<()> {
let alice = &TestContext::new_alice().await;
let chat_id = create_group_chat(alice, ProtectionStatus::Unprotected, "foo").await?;
send_webxdc_instance(alice, chat_id).await?;
let chat_id = create_group_chat(alice, ProtectionStatus::Unprotected, "bar").await?;
let instance = send_webxdc_instance(alice, chat_id).await?;
alice.send_text(chat_id, "wtf").await;
chat_id.delete(alice).await?;
let EventType::WebxdcInstanceDeleted { msg_id } = alice
.evtracker
.get_matching(|evt| matches!(evt, EventType::WebxdcInstanceDeleted { .. }))
.await
else {
unreachable!();
};
assert_eq!(msg_id, instance.id);
assert!(alice
.evtracker
.get_matching_opt(alice, |evt| matches!(
evt,
EventType::WebxdcInstanceDeleted { .. }
))
.await
.is_none());
Ok(())
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn change_logging_webxdc() -> Result<()> {
let alice = TestContext::new_alice().await;