From 0832c28a40af751390540c95059a502a45ba78cc Mon Sep 17 00:00:00 2001 From: strawberry Date: Wed, 3 Jul 2024 12:53:51 -0400 Subject: [PATCH] dedupe some state accessors in various places Signed-off-by: strawberry --- src/api/client/directory.rs | 29 +++-------- src/api/client/unstable.rs | 3 +- src/service/rooms/spaces/mod.rs | 66 +++++++------------------ src/service/rooms/state_accessor/mod.rs | 6 +-- 4 files changed, 30 insertions(+), 74 deletions(-) diff --git a/src/api/client/directory.rs b/src/api/client/directory.rs index 7671b90a..512dface 100644 --- a/src/api/client/directory.rs +++ b/src/api/client/directory.rs @@ -10,11 +10,7 @@ use ruma::{ }, directory::{Filter, PublicRoomJoinRule, PublicRoomsChunk, RoomNetwork}, events::{ - room::{ - avatar::RoomAvatarEventContent, - create::RoomCreateEventContent, - join_rules::{JoinRule, RoomJoinRulesEventContent}, - }, + room::join_rules::{JoinRule, RoomJoinRulesEventContent}, StateEventType, }, uint, ServerName, UInt, @@ -256,15 +252,10 @@ pub(crate) async fn get_public_rooms_filtered_helper( avatar_url: services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomAvatar, "")? - .map(|s| { - serde_json::from_str(s.content.get()) - .map(|c: RoomAvatarEventContent| c.url) - .map_err(|_| Error::bad_database("Invalid room avatar event in database.")) - }) - .transpose()? - // url is now an Option so we must flatten - .flatten(), + .get_avatar(&room_id)? + .into_option() + .unwrap_or_default() + .url, join_rule: services() .rooms .state_accessor @@ -287,15 +278,7 @@ pub(crate) async fn get_public_rooms_filtered_helper( room_type: services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomCreate, "")? - .map(|s| { - serde_json::from_str::(s.content.get()).map_err(|e| { - error!("Invalid room create event in database: {}", e); - Error::BadDatabase("Invalid room create event in database.") - }) - }) - .transpose()? - .and_then(|e| e.room_type), + .get_room_type(&room_id)?, room_id, }; Ok(chunk) diff --git a/src/api/client/unstable.rs b/src/api/client/unstable.rs index f53460a8..77cac0fa 100644 --- a/src/api/client/unstable.rs +++ b/src/api/client/unstable.rs @@ -106,7 +106,8 @@ pub(crate) async fn get_room_summary( canonical_alias: services() .rooms .state_accessor - .get_canonical_alias(&room_id)?, + .get_canonical_alias(&room_id) + .unwrap_or(None), avatar_url: services() .rooms .state_accessor diff --git a/src/service/rooms/spaces/mod.rs b/src/service/rooms/spaces/mod.rs index 3dfbcf3c..6a87ac98 100644 --- a/src/service/rooms/spaces/mod.rs +++ b/src/service/rooms/spaces/mod.rs @@ -19,13 +19,7 @@ use ruma::{ }, }, events::{ - room::{ - avatar::RoomAvatarEventContent, - canonical_alias::RoomCanonicalAliasEventContent, - create::RoomCreateEventContent, - join_rules::{JoinRule, RoomJoinRulesEventContent}, - topic::RoomTopicEventContent, - }, + room::join_rules::{JoinRule, RoomJoinRulesEventContent}, space::child::{HierarchySpaceChildEvent, SpaceChildEventContent}, StateEventType, }, @@ -409,19 +403,20 @@ impl Service { canonical_alias: services() .rooms .state_accessor - .room_state_get(room_id, &StateEventType::RoomCanonicalAlias, "")? - .map_or(Ok(None), |s| { - serde_json::from_str(s.content.get()) - .map(|c: RoomCanonicalAliasEventContent| c.alias) - .map_err(|_| Error::bad_database("Invalid canonical alias event in database.")) - })?, - name: services().rooms.state_accessor.get_name(room_id)?, + .get_canonical_alias(room_id) + .unwrap_or(None), + name: services() + .rooms + .state_accessor + .get_name(room_id) + .unwrap_or(None), num_joined_members: services() .rooms .state_cache - .room_joined_count(room_id)? + .room_joined_count(room_id) + .unwrap_or_default() .unwrap_or_else(|| { - warn!("Room {} has no member count", room_id); + warn!("Room {room_id} has no member count"); 0 }) .try_into() @@ -430,42 +425,19 @@ impl Service { topic: services() .rooms .state_accessor - .room_state_get(room_id, &StateEventType::RoomTopic, "")? - .map_or(Ok(None), |s| { - serde_json::from_str(s.content.get()) - .map(|c: RoomTopicEventContent| Some(c.topic)) - .map_err(|_| { - error!("Invalid room topic event in database for room {}", room_id); - Error::bad_database("Invalid room topic event in database.") - }) - })?, + .get_room_topic(room_id) + .unwrap_or(None), world_readable: services().rooms.state_accessor.is_world_readable(room_id)?, guest_can_join: services().rooms.state_accessor.guest_can_join(room_id)?, avatar_url: services() - .rooms - .state_accessor - .room_state_get(room_id, &StateEventType::RoomAvatar, "")? - .map(|s| { - serde_json::from_str(s.content.get()) - .map(|c: RoomAvatarEventContent| c.url) - .map_err(|_| Error::bad_database("Invalid room avatar event in database.")) - }) - .transpose()? - // url is now an Option so we must flatten - .flatten(), - join_rule, - room_type: services() .rooms .state_accessor - .room_state_get(room_id, &StateEventType::RoomCreate, "")? - .map(|s| { - serde_json::from_str::(s.content.get()).map_err(|e| { - error!("Invalid room create event in database: {}", e); - Error::BadDatabase("Invalid room create event in database.") - }) - }) - .transpose()? - .and_then(|e| e.room_type), + .get_avatar(room_id)? + .into_option() + .unwrap_or_default() + .url, + join_rule, + room_type: services().rooms.state_accessor.get_room_type(room_id)?, children_state, allowed_room_ids, }) diff --git a/src/service/rooms/state_accessor/mod.rs b/src/service/rooms/state_accessor/mod.rs index cdd8bec9..03e22187 100644 --- a/src/service/rooms/state_accessor/mod.rs +++ b/src/service/rooms/state_accessor/mod.rs @@ -422,10 +422,10 @@ impl Service { ) } - /// Returns the join rule for a given room - pub fn get_join_rule(&self, current_room: &RoomId) -> Result<(SpaceRoomJoinRule, Vec), Error> { + /// Returns the join rule (`SpaceRoomJoinRule`) for a given room + pub fn get_join_rule(&self, room_id: &RoomId) -> Result<(SpaceRoomJoinRule, Vec), Error> { Ok(self - .room_state_get(current_room, &StateEventType::RoomJoinRules, "")? + .room_state_get(room_id, &StateEventType::RoomJoinRules, "")? .map(|s| { serde_json::from_str(s.content.get()) .map(|c: RoomJoinRulesEventContent| {