mirror of
https://github.com/chatmail/core.git
synced 2026-05-04 13:56:30 +03:00
fix: Emit WebxdcInstanceDeleted events when deleting a chat (#6670)
This commit is contained in:
12
src/chat.rs
12
src/chat.rs
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user