diff --git a/CHANGELOG.md b/CHANGELOG.md index 21bafce20..a0a2169ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,9 @@ deltachat-rpc-server now reads the next request as soon as previous request handler is spawned. ### API-Changes + - 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 diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index 49ed900c3..22f261ced 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -45,6 +45,7 @@ use types::message::MessageObject; use types::provider_info::ProviderInfo; use types::webxdc::WebxdcMessageInfo; +use self::types::message::MessageLoadResult; use self::types::{ chat::{BasicChat, JSONRPCChatVisibility, MuteDuration}, location::JsonrpcLocation, @@ -465,7 +466,7 @@ impl CommandApi { Ok(res) => res, Err(err) => ChatListItemFetchResult::Error { id: entry.0, - error: format!("{err:?}"), + error: format!("{err:#}"), }, }, ); @@ -945,17 +946,27 @@ impl CommandApi { 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( &self, account_id: u32, message_ids: Vec, - ) -> Result> { + ) -> Result> { let ctx = self.get_context(account_id).await?; - let mut messages: HashMap = HashMap::new(); + let mut messages: HashMap = HashMap::new(); for message_id in message_ids { + let message_result = MessageObject::from_message_id(&ctx, message_id).await; messages.insert( 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) diff --git a/deltachat-jsonrpc/src/api/types/message.rs b/deltachat-jsonrpc/src/api/types/message.rs index 9030467f6..04a850715 100644 --- a/deltachat-jsonrpc/src/api/types/message.rs +++ b/deltachat-jsonrpc/src/api/types/message.rs @@ -19,6 +19,13 @@ use super::contact::ContactObject; use super::reactions::JSONRPCReactions; use super::webxdc::WebxdcMessageInfo; +#[derive(Serialize, TypeDef)] +#[serde(rename_all = "camelCase", tag = "variant")] +pub enum MessageLoadResult { + Message(MessageObject), + LoadingError { error: String }, +} + #[derive(Serialize, TypeDef)] #[serde(rename = "Message", rename_all = "camelCase")] pub struct MessageObject { diff --git a/deltachat-jsonrpc/typescript/example/example.ts b/deltachat-jsonrpc/typescript/example/example.ts index c180a9e31..0caa2de06 100644 --- a/deltachat-jsonrpc/typescript/example/example.ts +++ b/deltachat-jsonrpc/typescript/example/example.ts @@ -81,7 +81,9 @@ async function run() { messageIds ); for (const [_messageId, message] of Object.entries(messages)) { - write($main, `

${message.text}

`); + if (message.variant === "message") + write($main, `

${message.text}

`); + else write($main, `

loading error: ${message.error}

`); } } }