mirror of
https://github.com/chatmail/core.git
synced 2026-05-09 01:46: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?,
|
Sync => chat.get_sync_id(context).await?,
|
||||||
};
|
};
|
||||||
|
|
||||||
context
|
let webxdc_ids = context
|
||||||
.sql
|
.sql
|
||||||
.transaction(|transaction| {
|
.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(
|
transaction.execute(
|
||||||
"UPDATE imap SET target=? WHERE rfc724_mid IN (SELECT rfc724_mid FROM msgs WHERE chat_id=?)",
|
"UPDATE imap SET target=? WHERE rfc724_mid IN (SELECT rfc724_mid FROM msgs WHERE chat_id=?)",
|
||||||
(delete_msgs_target, self,),
|
(delete_msgs_target, self,),
|
||||||
@@ -819,10 +824,13 @@ impl ChatId {
|
|||||||
transaction.execute("DELETE FROM msgs WHERE chat_id=?", (self,))?;
|
transaction.execute("DELETE FROM msgs WHERE chat_id=?", (self,))?;
|
||||||
transaction.execute("DELETE FROM chats_contacts WHERE chat_id=?", (self,))?;
|
transaction.execute("DELETE FROM chats_contacts WHERE chat_id=?", (self,))?;
|
||||||
transaction.execute("DELETE FROM chats WHERE id=?", (self,))?;
|
transaction.execute("DELETE FROM chats WHERE id=?", (self,))?;
|
||||||
Ok(())
|
Ok(webxdc_ids)
|
||||||
})
|
})
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
for msg_id in webxdc_ids {
|
||||||
|
context.emit_event(EventType::WebxdcInstanceDeleted { msg_id });
|
||||||
|
}
|
||||||
context.emit_event(EventType::ChatDeleted { chat_id: self });
|
context.emit_event(EventType::ChatDeleted { chat_id: self });
|
||||||
context.emit_msgs_changed_without_ids();
|
context.emit_msgs_changed_without_ids();
|
||||||
|
|
||||||
|
|||||||
@@ -1790,6 +1790,37 @@ async fn test_webxdc_delete_event() -> Result<()> {
|
|||||||
Ok(())
|
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)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
async fn change_logging_webxdc() -> Result<()> {
|
async fn change_logging_webxdc() -> Result<()> {
|
||||||
let alice = TestContext::new_alice().await;
|
let alice = TestContext::new_alice().await;
|
||||||
|
|||||||
Reference in New Issue
Block a user