From 3fe457db832cc66e2b6672c35d04d067dc344aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Wed, 9 Apr 2025 14:29:37 +0200 Subject: [PATCH] refactor(room): change `Room::own_membership_details` to `member_with_sender_info`. The function will now return the previously added `RoomMemberWithSenderInfo` struct. --- crates/matrix-sdk/src/room/mod.rs | 68 ++++++++++++++++++------------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/crates/matrix-sdk/src/room/mod.rs b/crates/matrix-sdk/src/room/mod.rs index 5b07c54e4..3807aabae 100644 --- a/crates/matrix-sdk/src/room/mod.rs +++ b/crates/matrix-sdk/src/room/mod.rs @@ -2960,17 +2960,20 @@ impl Room { /// Get the membership details for the current user. /// /// Returns: - /// - If the current user was present in the room, a tuple of the - /// current user's [`RoomMember`] info and the member info of the - /// sender of that member event. + /// - If the user was present in the room, a [RoomMemberWithSenderInfo] + /// containing both the user info and the member info of the sender of + /// the `m.room.member` event. /// - If the current user is not present, an error. - pub async fn own_membership_details(&self) -> Result<(RoomMember, Option)> { - let Some(own_member) = self.get_member_no_sync(self.own_user_id()).await? else { + pub async fn member_with_sender_info( + &self, + user_id: &UserId, + ) -> Result { + let Some(member) = self.get_member_no_sync(user_id).await? else { return Err(Error::InsufficientData); }; let sender_member = - if let Some(member) = self.get_member_no_sync(own_member.event().sender()).await? { + if let Some(member) = self.get_member_no_sync(member.event().sender()).await? { // If the sender room member info is already available, return it Some(member) } else if self.are_members_synced() { @@ -2978,12 +2981,12 @@ impl Room { None } else if self.sync_members().await.is_ok() { // Try getting the sender room member info again after syncing - self.get_member_no_sync(own_member.event().sender()).await? + self.get_member_no_sync(member.event().sender()).await? } else { None }; - Ok((own_member, sender_member)) + Ok(RoomMemberWithSenderInfo { room_member: member, sender_info: sender_member }) } /// Forget this room. @@ -3842,7 +3845,6 @@ pub struct RoomMemberWithSenderInfo { #[cfg(all(test, not(target_arch = "wasm32")))] mod tests { - use assert_matches2::assert_matches; use matrix_sdk_base::{store::ComposerDraftType, ComposerDraft}; use matrix_sdk_test::{ async_test, event_factory::EventFactory, test_json, JoinedRoomBuilder, StateTestEvent, @@ -4083,7 +4085,7 @@ mod tests { // Since there is no member event for the own user, the method fails. // This should never happen in an actual room. - let error = room.own_membership_details().await.err(); + let error = room.member_with_sender_info(client.user_id().unwrap()).await.err(); assert!(error.is_some()); } @@ -4100,14 +4102,16 @@ mod tests { let room = server.sync_room(&client, joined_room_builder).await; // When we load the membership details - let ret = room.own_membership_details().await; - assert_matches!(ret, Ok((member, sender))); + let ret = room + .member_with_sender_info(client.user_id().unwrap()) + .await + .expect("Room member info should be available"); // We get the member info for the current user - assert_eq!(member.event().user_id(), user_id); + assert_eq!(ret.room_member.event().user_id(), user_id); // But there is no info for the sender - assert!(sender.is_none()); + assert!(ret.sender_info.is_none()); } #[async_test] @@ -4123,15 +4127,17 @@ mod tests { let room = server.sync_room(&client, joined_room_builder).await; // When we load the membership details - let ret = room.own_membership_details().await; - assert_matches!(ret, Ok((member, sender))); + let ret = room + .member_with_sender_info(client.user_id().unwrap()) + .await + .expect("Room member info should be available"); // We get the current user's member info - assert_eq!(member.event().user_id(), user_id); + assert_eq!(ret.room_member.event().user_id(), user_id); // And the sender has the same info, since it's also the current user - assert!(sender.is_some()); - assert_eq!(sender.unwrap().event().user_id(), user_id); + assert!(ret.sender_info.is_some()); + assert_eq!(ret.sender_info.unwrap().event().user_id(), user_id); } #[async_test] @@ -4151,15 +4157,17 @@ mod tests { let room = server.sync_room(&client, joined_room_builder).await; // When we load the membership details - let ret = room.own_membership_details().await; - assert_matches!(ret, Ok((member, sender))); + let ret = room + .member_with_sender_info(client.user_id().unwrap()) + .await + .expect("Room member info should be available"); // We get the current user's member info - assert_eq!(member.event().user_id(), user_id); + assert_eq!(ret.room_member.event().user_id(), user_id); // And also the sender info from the events received in the sync - assert!(sender.is_some()); - assert_eq!(sender.unwrap().event().user_id(), sender_id); + assert!(ret.sender_info.is_some()); + assert_eq!(ret.sender_info.unwrap().event().user_id(), sender_id); } #[async_test] @@ -4184,14 +4192,16 @@ mod tests { .await; // We get the current user's member info - let ret = room.own_membership_details().await; - assert_matches!(ret, Ok((member, sender))); + let ret = room + .member_with_sender_info(client.user_id().unwrap()) + .await + .expect("Room member info should be available"); // We get the current user's member info - assert_eq!(member.event().user_id(), user_id); + assert_eq!(ret.room_member.event().user_id(), user_id); // And also the sender info from the /members endpoint - assert!(sender.is_some()); - assert_eq!(sender.unwrap().event().user_id(), sender_id); + assert!(ret.sender_info.is_some()); + assert_eq!(ret.sender_info.unwrap().event().user_id(), sender_id); } }