Skip to content

Commit 7510c2c

Browse files
committed
refactor: Adapt to the changes of the room summary and directory endpoints
Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
1 parent 84c6572 commit 7510c2c

File tree

6 files changed

+70
-70
lines changed

6 files changed

+70
-70
lines changed

bindings/matrix-sdk-ffi/src/room_directory_search.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,21 @@ use crate::{error::ClientError, runtime::get_runtime_handle, task_handle::TaskHa
2828
pub enum PublicRoomJoinRule {
2929
Public,
3030
Knock,
31+
Restricted,
32+
KnockRestricted,
33+
Invite,
3134
}
3235

33-
impl TryFrom<ruma::directory::PublicRoomJoinRule> for PublicRoomJoinRule {
36+
impl TryFrom<ruma::room::JoinRuleKind> for PublicRoomJoinRule {
3437
type Error = String;
3538

36-
fn try_from(value: ruma::directory::PublicRoomJoinRule) -> Result<Self, Self::Error> {
39+
fn try_from(value: ruma::room::JoinRuleKind) -> Result<Self, Self::Error> {
3740
match value {
38-
ruma::directory::PublicRoomJoinRule::Public => Ok(Self::Public),
39-
ruma::directory::PublicRoomJoinRule::Knock => Ok(Self::Knock),
41+
ruma::room::JoinRuleKind::Public => Ok(Self::Public),
42+
ruma::room::JoinRuleKind::Knock => Ok(Self::Knock),
43+
ruma::room::JoinRuleKind::Restricted => Ok(Self::Restricted),
44+
ruma::room::JoinRuleKind::KnockRestricted => Ok(Self::KnockRestricted),
45+
ruma::room::JoinRuleKind::Invite => Ok(Self::Invite),
4046
rule => Err(format!("unsupported join rule: {rule:?}")),
4147
}
4248
}

bindings/matrix-sdk-ffi/src/room_preview.rs

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use anyhow::Context as _;
22
use matrix_sdk::{room_preview::RoomPreview as SdkRoomPreview, Client};
3-
use ruma::{room::RoomType as RumaRoomType, space::SpaceRoomJoinRule};
3+
use ruma::room::{JoinRuleSummary, RoomType as RumaRoomType};
44
use tracing::warn;
55

66
use crate::{
7-
client::JoinRule,
7+
client::{AllowRule, JoinRule},
88
error::ClientError,
99
room::{Membership, RoomHero},
1010
room_member::{RoomMember, RoomMemberWithSenderInfo},
@@ -40,7 +40,7 @@ impl RoomPreview {
4040
.as_ref()
4141
.map(TryInto::try_into)
4242
.transpose()
43-
.map_err(|_| anyhow::anyhow!("unhandled SpaceRoomJoinRule kind"))?,
43+
.map_err(|_| anyhow::anyhow!("unhandled JoinRuleSummary kind"))?,
4444
is_direct: info.is_direct,
4545
heroes: info
4646
.heroes
@@ -122,20 +122,32 @@ pub struct RoomPreviewInfo {
122122
pub heroes: Option<Vec<RoomHero>>,
123123
}
124124

125-
impl TryFrom<&SpaceRoomJoinRule> for JoinRule {
125+
impl TryFrom<&JoinRuleSummary> for JoinRule {
126126
type Error = ();
127127

128-
fn try_from(join_rule: &SpaceRoomJoinRule) -> Result<Self, ()> {
128+
fn try_from(join_rule: &JoinRuleSummary) -> Result<Self, ()> {
129129
Ok(match join_rule {
130-
SpaceRoomJoinRule::Invite => JoinRule::Invite,
131-
SpaceRoomJoinRule::Knock => JoinRule::Knock,
132-
SpaceRoomJoinRule::Private => JoinRule::Private,
133-
SpaceRoomJoinRule::Restricted => JoinRule::Restricted { rules: Vec::new() },
134-
SpaceRoomJoinRule::KnockRestricted => JoinRule::KnockRestricted { rules: Vec::new() },
135-
SpaceRoomJoinRule::Public => JoinRule::Public,
136-
SpaceRoomJoinRule::_Custom(_) => JoinRule::Custom { repr: join_rule.to_string() },
130+
JoinRuleSummary::Invite => JoinRule::Invite,
131+
JoinRuleSummary::Knock => JoinRule::Knock,
132+
JoinRuleSummary::Private => JoinRule::Private,
133+
JoinRuleSummary::Restricted(summary) => JoinRule::Restricted {
134+
rules: summary
135+
.allowed_room_ids
136+
.iter()
137+
.map(|room_id| AllowRule::RoomMembership { room_id: room_id.to_string() })
138+
.collect(),
139+
},
140+
JoinRuleSummary::KnockRestricted(summary) => JoinRule::KnockRestricted {
141+
rules: summary
142+
.allowed_room_ids
143+
.iter()
144+
.map(|room_id| AllowRule::RoomMembership { room_id: room_id.to_string() })
145+
.collect(),
146+
},
147+
JoinRuleSummary::Public => JoinRule::Public,
148+
JoinRuleSummary::_Custom(_) => JoinRule::Custom { repr: join_rule.as_str().to_owned() },
137149
_ => {
138-
warn!("unhandled SpaceRoomJoinRule: {join_rule}");
150+
warn!("unhandled JoinRuleSummary: {}", join_rule.as_str());
139151
return Err(());
140152
}
141153
})

crates/matrix-sdk/src/room_directory_search.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ use futures_core::Stream;
2020
use imbl::Vector;
2121
use ruma::{
2222
api::client::directory::get_public_rooms_filtered::v3::Request as PublicRoomsFilterRequest,
23-
directory::{Filter, PublicRoomJoinRule},
24-
OwnedMxcUri, OwnedRoomAliasId, OwnedRoomId,
23+
directory::Filter, room::JoinRuleKind, OwnedMxcUri, OwnedRoomAliasId, OwnedRoomId,
2524
};
2625

2726
use crate::{Client, OwnedServerName, Result};
@@ -42,7 +41,7 @@ pub struct RoomDescription {
4241
/// The room's avatar URL, if any.
4342
pub avatar_url: Option<OwnedMxcUri>,
4443
/// The room's join rule.
45-
pub join_rule: PublicRoomJoinRule,
44+
pub join_rule: JoinRuleKind,
4645
/// Whether can be previewed
4746
pub is_world_readable: bool,
4847
/// The number of members that have joined the room.
@@ -220,7 +219,9 @@ mod tests {
220219
use eyeball_im::VectorDiff;
221220
use futures_util::StreamExt;
222221
use matrix_sdk_test::{async_test, test_json};
223-
use ruma::{directory::Filter, owned_server_name, serde::Raw, RoomAliasId, RoomId};
222+
use ruma::{
223+
directory::Filter, owned_server_name, room::JoinRuleKind, serde::Raw, RoomAliasId, RoomId,
224+
};
224225
use serde_json::Value as JsonValue;
225226
use stream_assert::assert_pending;
226227
use wiremock::{
@@ -279,7 +280,7 @@ mod tests {
279280
topic: Some("Tasty tasty cheese".into()),
280281
alias: None,
281282
avatar_url: Some("mxc://bleeker.street/CHEDDARandBRIE".into()),
282-
join_rule: ruma::directory::PublicRoomJoinRule::Public,
283+
join_rule: JoinRuleKind::Public,
283284
is_world_readable: true,
284285
joined_members: 37,
285286
}
@@ -292,7 +293,7 @@ mod tests {
292293
topic: Some("Tasty tasty pear".into()),
293294
alias: RoomAliasId::parse("#murrays:pear.bar").ok(),
294295
avatar_url: Some("mxc://bleeker.street/pear".into()),
295-
join_rule: ruma::directory::PublicRoomJoinRule::Knock,
296+
join_rule: JoinRuleKind::Knock,
296297
is_world_readable: false,
297298
joined_members: 20,
298299
}

crates/matrix-sdk/src/room_preview.rs

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@ use futures_util::future::join_all;
2222
use matrix_sdk_base::{RoomHero, RoomInfo, RoomState};
2323
use ruma::{
2424
api::client::{membership::joined_members, state::get_state_events},
25-
directory::PublicRoomJoinRule,
26-
events::room::{history_visibility::HistoryVisibility, join_rules::JoinRule},
27-
room::RoomType,
28-
space::SpaceRoomJoinRule,
25+
events::room::history_visibility::HistoryVisibility,
26+
room::{JoinRuleSummary, RoomType},
2927
OwnedMxcUri, OwnedRoomAliasId, OwnedRoomId, OwnedServerName, RoomId, RoomOrAliasId, ServerName,
3028
};
3129
use tokio::try_join;
@@ -64,7 +62,7 @@ pub struct RoomPreview {
6462
pub room_type: Option<RoomType>,
6563

6664
/// What's the join rule for this room?
67-
pub join_rule: Option<SpaceRoomJoinRule>,
65+
pub join_rule: Option<JoinRuleSummary>,
6866

6967
/// Is the room world-readable (i.e. is its history_visibility set to
7068
/// world_readable)?
@@ -102,19 +100,7 @@ impl RoomPreview {
102100
topic: room_info.topic().map(ToOwned::to_owned),
103101
avatar_url: room_info.avatar_url().map(ToOwned::to_owned),
104102
room_type: room_info.room_type().cloned(),
105-
join_rule: room_info.join_rule().map(|rule| match rule {
106-
JoinRule::Invite => SpaceRoomJoinRule::Invite,
107-
JoinRule::Knock => SpaceRoomJoinRule::Knock,
108-
JoinRule::Private => SpaceRoomJoinRule::Private,
109-
JoinRule::Restricted(_) => SpaceRoomJoinRule::Restricted,
110-
JoinRule::KnockRestricted(_) => SpaceRoomJoinRule::KnockRestricted,
111-
JoinRule::Public => SpaceRoomJoinRule::Public,
112-
_ => {
113-
// The JoinRule enum is non-exhaustive. Let's do a white lie and pretend it's
114-
// private (a cautious choice).
115-
SpaceRoomJoinRule::Private
116-
}
117-
}),
103+
join_rule: room_info.join_rule().cloned().map(Into::into),
118104
is_world_readable: room_info
119105
.history_visibility()
120106
.map(|vis| *vis == HistoryVisibility::WorldReadable),
@@ -253,7 +239,7 @@ impl RoomPreview {
253239
let own_server_name = client.session_meta().map(|s| s.user_id.server_name());
254240
let via = ensure_server_names_is_not_empty(own_server_name, via, room_or_alias_id);
255241

256-
let request = ruma::api::client::room::get_summary::msc3266::Request::new(
242+
let request = ruma::api::client::room::get_summary::v1::Request::new(
257243
room_or_alias_id.to_owned(),
258244
via,
259245
);
@@ -278,17 +264,19 @@ impl RoomPreview {
278264
None
279265
};
280266

267+
let summary = response.summary;
268+
281269
Ok(RoomPreview {
282270
room_id,
283-
canonical_alias: response.canonical_alias,
284-
name: response.name,
285-
topic: response.topic,
286-
avatar_url: response.avatar_url,
287-
num_joined_members: response.num_joined_members.into(),
271+
canonical_alias: summary.canonical_alias,
272+
name: summary.name,
273+
topic: summary.topic,
274+
avatar_url: summary.avatar_url,
275+
num_joined_members: summary.num_joined_members.into(),
288276
num_active_members,
289-
room_type: response.room_type,
290-
join_rule: Some(response.join_rule),
291-
is_world_readable: Some(response.world_readable),
277+
room_type: summary.room_type,
278+
join_rule: Some(summary.join_rule),
279+
is_world_readable: Some(summary.world_readable),
292280
state,
293281
is_direct,
294282
heroes: cached_room.map(|r| r.heroes()),
@@ -375,14 +363,7 @@ async fn search_for_room_preview_in_room_directory(
375363
num_active_members: None,
376364
// Assume it's a room
377365
room_type: None,
378-
join_rule: Some(match room_description.join_rule {
379-
PublicRoomJoinRule::Public => SpaceRoomJoinRule::Public,
380-
PublicRoomJoinRule::Knock => SpaceRoomJoinRule::Knock,
381-
PublicRoomJoinRule::_Custom(rule) => SpaceRoomJoinRule::_Custom(rule),
382-
_ => {
383-
panic!("Unexpected PublicRoomJoinRule {:?}", room_description.join_rule)
384-
}
385-
}),
366+
join_rule: Some(room_description.join_rule.into()),
386367
is_world_readable: Some(room_description.is_world_readable),
387368
state: None,
388369
is_direct: None,

crates/matrix-sdk/tests/integration/room_preview.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ use matrix_sdk_test::{
99
async_test, InvitedRoomBuilder, JoinedRoomBuilder, KnockedRoomBuilder, SyncResponseBuilder,
1010
};
1111
use ruma::{
12-
api::client::sync::sync_events::{v5 as sliding_sync_http, v5::response::Hero},
12+
api::client::sync::sync_events::v5::{self as sliding_sync_http, response::Hero},
1313
assign,
1414
events::room::member::MembershipState,
15-
owned_user_id, room_id,
16-
space::SpaceRoomJoinRule,
17-
RoomId,
15+
owned_user_id,
16+
room::JoinRuleSummary,
17+
room_id, RoomId,
1818
};
1919
use serde_json::json;
2020
use wiremock::{
@@ -39,7 +39,7 @@ async fn test_room_preview_leave_invited() {
3939
mock_unknown_summary(
4040
room_id,
4141
None,
42-
SpaceRoomJoinRule::Knock,
42+
JoinRuleSummary::Knock,
4343
Some(MembershipState::Invite),
4444
&server,
4545
)
@@ -97,7 +97,7 @@ async fn test_room_preview_leave_knocked() {
9797
mock_unknown_summary(
9898
room_id,
9999
None,
100-
SpaceRoomJoinRule::Knock,
100+
JoinRuleSummary::Knock,
101101
Some(MembershipState::Knock),
102102
&server,
103103
)
@@ -141,7 +141,7 @@ async fn test_room_preview_leave_unknown_room_fails() {
141141
let (client, server) = logged_in_client_with_server().await;
142142
let room_id = room_id!("!room:localhost");
143143

144-
mock_unknown_summary(room_id, None, SpaceRoomJoinRule::Knock, None, &server).await;
144+
mock_unknown_summary(room_id, None, JoinRuleSummary::Knock, None, &server).await;
145145

146146
let room_preview = client.get_room_preview(room_id.into(), Vec::new()).await.unwrap();
147147
assert!(room_preview.state.is_none());
@@ -193,7 +193,7 @@ async fn mock_leave(room_id: &RoomId, server: &MockServer) {
193193
async fn mock_unknown_summary(
194194
room_id: &RoomId,
195195
alias: Option<String>,
196-
join_rule: SpaceRoomJoinRule,
196+
join_rule: JoinRuleSummary,
197197
membership: Option<MembershipState>,
198198
server: &MockServer,
199199
) {

testing/matrix-sdk-integration-testing/src/tests/sliding_sync/room.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ use matrix_sdk::{
3232
},
3333
AnySyncMessageLikeEvent, InitialStateEvent, Mentions, StateEventType,
3434
},
35-
mxc_uri, owned_server_name, room_id,
36-
space::SpaceRoomJoinRule,
37-
uint, RoomId,
35+
mxc_uri, owned_server_name,
36+
room::JoinRuleSummary,
37+
room_id, uint, RoomId,
3838
},
3939
sliding_sync::VersionBuilder,
4040
test_utils::{logged_in_client_with_server, mocks::MatrixMockServer},
@@ -1228,7 +1228,7 @@ fn assert_room_preview(preview: &RoomPreview, room_alias: &str) {
12281228
assert_eq!(preview.avatar_url.as_ref().unwrap(), mxc_uri!("mxc://localhost/alice"));
12291229
assert_eq!(preview.num_joined_members, 1);
12301230
assert!(preview.room_type.is_none());
1231-
assert_eq!(preview.join_rule, Some(SpaceRoomJoinRule::Invite));
1231+
assert_eq!(preview.join_rule, Some(JoinRuleSummary::Invite));
12321232
assert!(preview.is_world_readable.unwrap());
12331233
}
12341234

0 commit comments

Comments
 (0)