diff --git a/matrix_sdk_base/src/store/memory_store.rs b/matrix_sdk_base/src/store/memory_store.rs index 8bf11358..cb474676 100644 --- a/matrix_sdk_base/src/store/memory_store.rs +++ b/matrix_sdk_base/src/store/memory_store.rs @@ -293,6 +293,33 @@ impl MemoryStore { })) } + async fn get_state_events(&self, room_id: &RoomId) -> Result>> { + #[allow(clippy::map_clone)] + Ok(self + .room_state + .get(room_id) + .map(|r| { + r.iter().flat_map(|t| t.clone().into_iter().map(|(_, e)| e.clone())).collect() + // e.get(event_type.as_ref()).map(|s| s.iter().map(|e| e.clone()).collect::>()) + }) + .unwrap_or_default()) + } + + async fn get_state_events_by_type( + &self, + room_id: &RoomId, + event_type: EventType, + ) -> Result>> { + #[allow(clippy::map_clone)] + Ok(self + .room_state + .get(room_id) + .and_then(|e| { + e.get(event_type.as_ref()).map(|s| s.iter().map(|e| e.clone()).collect::>()) + }) + .unwrap_or_default()) + } + async fn get_profile( &self, room_id: &RoomId, @@ -458,6 +485,18 @@ impl StateStore for MemoryStore { self.get_state_event(room_id, event_type, state_key).await } + async fn get_state_events(&self, room_id: &RoomId) -> Result>> { + self.get_state_events(room_id).await + } + + async fn get_state_events_by_type( + &self, + room_id: &RoomId, + event_type: EventType, + ) -> Result>> { + self.get_state_events_by_type(room_id, event_type).await + } + async fn get_profile( &self, room_id: &RoomId, diff --git a/matrix_sdk_base/src/store/mod.rs b/matrix_sdk_base/src/store/mod.rs index 05fadc3f..d3828251 100644 --- a/matrix_sdk_base/src/store/mod.rs +++ b/matrix_sdk_base/src/store/mod.rs @@ -133,6 +133,26 @@ pub trait StateStore: AsyncTraitDeps { state_key: &str, ) -> Result>>; + /// Get all synced state events for a room. + /// + /// # Arguments + /// + /// * `room_id` - The id of the room to get state events for. + async fn get_state_events(&self, room_id: &RoomId) -> Result>>; + + /// Get a list of state events for a given `EventType`. + /// + /// # Arguments + /// + /// * `room_id` - The id of the room to find events for. + /// + /// * `event_type` - The event type to find. + async fn get_state_events_by_type( + &self, + room_id: &RoomId, + event_type: EventType, + ) -> Result>>; + /// Get the current profile for the given user in the given room. /// /// # Arguments diff --git a/matrix_sdk_base/src/store/sled_store/mod.rs b/matrix_sdk_base/src/store/sled_store/mod.rs index 4f3ba8f2..274ea72d 100644 --- a/matrix_sdk_base/src/store/sled_store/mod.rs +++ b/matrix_sdk_base/src/store/sled_store/mod.rs @@ -580,6 +580,26 @@ impl SledStore { .transpose()?) } + pub async fn get_state_events(&self, room_id: &RoomId) -> Result>> { + Ok(self + .room_state + .scan_prefix((room_id.as_str()).encode()) + .flat_map(|e| e.map(|(_, e)| self.deserialize_event(&e))) + .collect::>()?) + } + + pub async fn get_state_events_by_type( + &self, + room_id: &RoomId, + event_type: EventType, + ) -> Result>> { + Ok(self + .room_state + .scan_prefix((room_id.as_str(), event_type.as_str()).encode()) + .flat_map(|e| e.map(|(_, e)| self.deserialize_event(&e))) + .collect::>()?) + } + pub async fn get_profile( &self, room_id: &RoomId, @@ -801,6 +821,18 @@ impl StateStore for SledStore { self.get_state_event(room_id, event_type, state_key).await } + async fn get_state_events(&self, room_id: &RoomId) -> Result>> { + self.get_state_events(room_id).await + } + + async fn get_state_events_by_type( + &self, + room_id: &RoomId, + event_type: EventType, + ) -> Result>> { + self.get_state_events_by_type(room_id, event_type).await + } + async fn get_profile( &self, room_id: &RoomId,