mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 01:16:31 +03:00
feat: Make resending OutPending messages possible (#5817)
This makes possible to schedule one more sending of the message, the existing jobs are not cancelled. Otherwise it's complicated to implement bots that resend messages when a new member joins the group.
This commit is contained in:
29
src/chat.rs
29
src/chat.rs
@@ -4260,7 +4260,11 @@ pub async fn resend_msgs(context: &Context, msg_ids: &[MsgId]) -> Result<()> {
|
|||||||
msg.update_param(context).await?;
|
msg.update_param(context).await?;
|
||||||
}
|
}
|
||||||
match msg.get_state() {
|
match msg.get_state() {
|
||||||
MessageState::OutFailed | MessageState::OutDelivered | MessageState::OutMdnRcvd => {
|
// `get_state()` may return an outdated `OutPending`, so update anyway.
|
||||||
|
MessageState::OutPending
|
||||||
|
| MessageState::OutFailed
|
||||||
|
| MessageState::OutDelivered
|
||||||
|
| MessageState::OutMdnRcvd => {
|
||||||
message::update_msg_state(context, msg.id, MessageState::OutPending).await?
|
message::update_msg_state(context, msg.id, MessageState::OutPending).await?
|
||||||
}
|
}
|
||||||
msg_state => bail!("Unexpected message state {msg_state}"),
|
msg_state => bail!("Unexpected message state {msg_state}"),
|
||||||
@@ -6846,8 +6850,29 @@ mod tests {
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
let sent2 = alice.pop_sent_msg().await;
|
let sent2 = alice.pop_sent_msg().await;
|
||||||
resend_msgs(&alice, &[sent1.sender_msg_id]).await?;
|
let resent_msg_id = sent1.sender_msg_id;
|
||||||
|
resend_msgs(&alice, &[resent_msg_id]).await?;
|
||||||
|
assert_eq!(
|
||||||
|
resent_msg_id.get_state(&alice).await?,
|
||||||
|
MessageState::OutPending
|
||||||
|
);
|
||||||
|
resend_msgs(&alice, &[resent_msg_id]).await?;
|
||||||
|
// Message can be re-sent multiple times.
|
||||||
|
assert_eq!(
|
||||||
|
resent_msg_id.get_state(&alice).await?,
|
||||||
|
MessageState::OutPending
|
||||||
|
);
|
||||||
|
alice.pop_sent_msg().await;
|
||||||
|
// There's still one more pending SMTP job.
|
||||||
|
assert_eq!(
|
||||||
|
resent_msg_id.get_state(&alice).await?,
|
||||||
|
MessageState::OutPending
|
||||||
|
);
|
||||||
let sent3 = alice.pop_sent_msg().await;
|
let sent3 = alice.pop_sent_msg().await;
|
||||||
|
assert_eq!(
|
||||||
|
resent_msg_id.get_state(&alice).await?,
|
||||||
|
MessageState::OutDelivered
|
||||||
|
);
|
||||||
|
|
||||||
// Bob receives all messages
|
// Bob receives all messages
|
||||||
let bob = TestContext::new_bob().await;
|
let bob = TestContext::new_bob().await;
|
||||||
|
|||||||
@@ -474,9 +474,17 @@ impl TestContext {
|
|||||||
.execute("DELETE FROM smtp WHERE id=?;", (rowid,))
|
.execute("DELETE FROM smtp WHERE id=?;", (rowid,))
|
||||||
.await
|
.await
|
||||||
.expect("failed to remove job");
|
.expect("failed to remove job");
|
||||||
update_msg_state(&self.ctx, msg_id, MessageState::OutDelivered)
|
if !self
|
||||||
|
.ctx
|
||||||
|
.sql
|
||||||
|
.exists("SELECT COUNT(*) FROM smtp WHERE msg_id=?", (msg_id,))
|
||||||
.await
|
.await
|
||||||
.expect("failed to update message state");
|
.expect("Failed to check for more jobs")
|
||||||
|
{
|
||||||
|
update_msg_state(&self.ctx, msg_id, MessageState::OutDelivered)
|
||||||
|
.await
|
||||||
|
.expect("failed to update message state");
|
||||||
|
}
|
||||||
|
|
||||||
let payload_headers = payload.split("\r\n\r\n").next().unwrap().lines();
|
let payload_headers = payload.split("\r\n\r\n").next().unwrap().lines();
|
||||||
let payload_header_names: Vec<_> = payload_headers
|
let payload_header_names: Vec<_> = payload_headers
|
||||||
|
|||||||
Reference in New Issue
Block a user