mirror of
https://github.com/chatmail/core.git
synced 2026-05-03 05:16:28 +03:00
jsonrpc: get_messages now returns a map with MessageLoadResult instead of failing completely if one of the requested messages could not be loaded. (#4038)
* jsonrpc: `get_messages` now returns a map with `MessageLoadResult` instead of failing completely if one of the requested messages could not be loaded. * add pr number to changelog * format errors with causes instead of debug output also for chatlistitemfetchresult
This commit is contained in:
@@ -10,7 +10,9 @@
|
|||||||
deltachat-rpc-server now reads the next request as soon as previous request handler is spawned.
|
deltachat-rpc-server now reads the next request as soon as previous request handler is spawned.
|
||||||
|
|
||||||
### API-Changes
|
### API-Changes
|
||||||
|
|
||||||
- Remove `MimeMessage::from_bytes()` public interface. #4033
|
- Remove `MimeMessage::from_bytes()` public interface. #4033
|
||||||
|
- BREAKING Types: jsonrpc: `get_messages` now returns a map with `MessageLoadResult` instead of failing completely if one of the requested messages could not be loaded. #4038
|
||||||
|
|
||||||
|
|
||||||
## 1.108.0
|
## 1.108.0
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ use types::message::MessageObject;
|
|||||||
use types::provider_info::ProviderInfo;
|
use types::provider_info::ProviderInfo;
|
||||||
use types::webxdc::WebxdcMessageInfo;
|
use types::webxdc::WebxdcMessageInfo;
|
||||||
|
|
||||||
|
use self::types::message::MessageLoadResult;
|
||||||
use self::types::{
|
use self::types::{
|
||||||
chat::{BasicChat, JSONRPCChatVisibility, MuteDuration},
|
chat::{BasicChat, JSONRPCChatVisibility, MuteDuration},
|
||||||
location::JsonrpcLocation,
|
location::JsonrpcLocation,
|
||||||
@@ -465,7 +466,7 @@ impl CommandApi {
|
|||||||
Ok(res) => res,
|
Ok(res) => res,
|
||||||
Err(err) => ChatListItemFetchResult::Error {
|
Err(err) => ChatListItemFetchResult::Error {
|
||||||
id: entry.0,
|
id: entry.0,
|
||||||
error: format!("{err:?}"),
|
error: format!("{err:#}"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@@ -945,17 +946,27 @@ impl CommandApi {
|
|||||||
MsgId::new(message_id).get_html(&ctx).await
|
MsgId::new(message_id).get_html(&ctx).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// get multiple messages in one call,
|
||||||
|
/// if loading one message fails the error is stored in the result object in it's place.
|
||||||
|
///
|
||||||
|
/// this is the batch variant of [get_message]
|
||||||
async fn get_messages(
|
async fn get_messages(
|
||||||
&self,
|
&self,
|
||||||
account_id: u32,
|
account_id: u32,
|
||||||
message_ids: Vec<u32>,
|
message_ids: Vec<u32>,
|
||||||
) -> Result<HashMap<u32, MessageObject>> {
|
) -> Result<HashMap<u32, MessageLoadResult>> {
|
||||||
let ctx = self.get_context(account_id).await?;
|
let ctx = self.get_context(account_id).await?;
|
||||||
let mut messages: HashMap<u32, MessageObject> = HashMap::new();
|
let mut messages: HashMap<u32, MessageLoadResult> = HashMap::new();
|
||||||
for message_id in message_ids {
|
for message_id in message_ids {
|
||||||
|
let message_result = MessageObject::from_message_id(&ctx, message_id).await;
|
||||||
messages.insert(
|
messages.insert(
|
||||||
message_id,
|
message_id,
|
||||||
MessageObject::from_message_id(&ctx, message_id).await?,
|
match message_result {
|
||||||
|
Ok(message) => MessageLoadResult::Message(message),
|
||||||
|
Err(error) => MessageLoadResult::LoadingError {
|
||||||
|
error: format!("{error:#}"),
|
||||||
|
},
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Ok(messages)
|
Ok(messages)
|
||||||
|
|||||||
@@ -19,6 +19,13 @@ use super::contact::ContactObject;
|
|||||||
use super::reactions::JSONRPCReactions;
|
use super::reactions::JSONRPCReactions;
|
||||||
use super::webxdc::WebxdcMessageInfo;
|
use super::webxdc::WebxdcMessageInfo;
|
||||||
|
|
||||||
|
#[derive(Serialize, TypeDef)]
|
||||||
|
#[serde(rename_all = "camelCase", tag = "variant")]
|
||||||
|
pub enum MessageLoadResult {
|
||||||
|
Message(MessageObject),
|
||||||
|
LoadingError { error: String },
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Serialize, TypeDef)]
|
#[derive(Serialize, TypeDef)]
|
||||||
#[serde(rename = "Message", rename_all = "camelCase")]
|
#[serde(rename = "Message", rename_all = "camelCase")]
|
||||||
pub struct MessageObject {
|
pub struct MessageObject {
|
||||||
|
|||||||
@@ -81,7 +81,9 @@ async function run() {
|
|||||||
messageIds
|
messageIds
|
||||||
);
|
);
|
||||||
for (const [_messageId, message] of Object.entries(messages)) {
|
for (const [_messageId, message] of Object.entries(messages)) {
|
||||||
write($main, `<p>${message.text}</p>`);
|
if (message.variant === "message")
|
||||||
|
write($main, `<p>${message.text}</p>`);
|
||||||
|
else write($main, `<p>loading error: ${message.error}</p>`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user