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:
Simon Laux
2023-02-15 19:46:34 +01:00
committed by GitHub
parent cd3f1fe874
commit 0de5125de8
4 changed files with 27 additions and 5 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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>`);
} }
} }
} }