Skip to content

Commit c2bc465

Browse files
Shrey Patelpoljar
authored andcommitted
feat(base): Add get_room_events to EventCacheStore trait and impls.
1 parent b788ba0 commit c2bc465

File tree

6 files changed

+135
-1
lines changed

6 files changed

+135
-1
lines changed

crates/matrix-sdk-base/src/event_cache/store/integration_tests.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ pub trait EventCacheStoreIntegrationTests {
141141
/// Test that finding event relations works as expected.
142142
async fn test_find_event_relations(&self);
143143

144+
/// Test that getting all events in a room works as expected.
145+
async fn test_get_room_events(&self);
146+
144147
/// Test that saving an event works as expected.
145148
async fn test_save_event(&self);
146149

@@ -919,6 +922,61 @@ impl EventCacheStoreIntegrationTests for DynEventCacheStore {
919922
);
920923
}
921924

925+
async fn test_get_room_events(&self) {
926+
let room_id = room_id!("!r0:matrix.org");
927+
let another_room_id = room_id!("!r1:matrix.org");
928+
let linked_chunk_id = LinkedChunkId::Room(room_id);
929+
let another_linked_chunk_id = LinkedChunkId::Room(another_room_id);
930+
let event = |msg: &str| make_test_event(room_id, msg);
931+
932+
let event_comte = event("comté");
933+
let event_gruyere = event("gruyère");
934+
let event_stilton = event("stilton");
935+
936+
// Add one event in one room.
937+
self.handle_linked_chunk_updates(
938+
linked_chunk_id,
939+
vec![
940+
Update::NewItemsChunk { previous: None, new: CId::new(0), next: None },
941+
Update::PushItems {
942+
at: Position::new(CId::new(0), 0),
943+
items: vec![event_comte.clone(), event_gruyere.clone()],
944+
},
945+
],
946+
)
947+
.await
948+
.unwrap();
949+
950+
// Add an event in a different room.
951+
self.handle_linked_chunk_updates(
952+
another_linked_chunk_id,
953+
vec![
954+
Update::NewItemsChunk { previous: None, new: CId::new(0), next: None },
955+
Update::PushItems {
956+
at: Position::new(CId::new(0), 0),
957+
items: vec![event_stilton.clone()],
958+
},
959+
],
960+
)
961+
.await
962+
.unwrap();
963+
964+
// Now let's find the events.
965+
let events = self.get_room_events(room_id).await.expect("failed to query for room events");
966+
967+
assert_eq!(events.len(), 2);
968+
969+
let got_ids: Vec<_> = events.into_iter().map(|ev| ev.event_id()).collect();
970+
let expected_ids = vec![event_comte.event_id(), event_gruyere.event_id()];
971+
972+
for expected in expected_ids {
973+
assert!(
974+
got_ids.contains(&expected),
975+
"Expected event {expected:?} not in got events: {got_ids:?}."
976+
);
977+
}
978+
}
979+
922980
async fn test_save_event(&self) {
923981
let room_id = room_id!("!r0:matrix.org");
924982
let another_room_id = room_id!("!r1:matrix.org");
@@ -1199,6 +1257,13 @@ macro_rules! event_cache_store_integration_tests {
11991257
event_cache_store.test_find_event_relations().await;
12001258
}
12011259

1260+
#[async_test]
1261+
async fn test_get_room_events() {
1262+
let event_cache_store =
1263+
get_event_cache_store().await.unwrap().into_event_cache_store();
1264+
event_cache_store.test_get_room_events().await;
1265+
}
1266+
12021267
#[async_test]
12031268
async fn test_save_event() {
12041269
let event_cache_store =

crates/matrix-sdk-base/src/event_cache/store/memory_store.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,15 @@ impl EventCacheStore for MemoryStore {
220220
Ok(related_events)
221221
}
222222

223+
async fn get_room_events(&self, room_id: &RoomId) -> Result<Vec<Event>, Self::Error> {
224+
let inner = self.inner.read().unwrap();
225+
226+
let event: Vec<_> =
227+
inner.events.items(room_id).map(|(event, _pos)| event.clone()).collect();
228+
229+
Ok(event)
230+
}
231+
223232
async fn save_event(&self, room_id: &RoomId, event: Event) -> Result<(), Self::Error> {
224233
if event.event_id().is_none() {
225234
error!(%room_id, "Trying to save an event with no ID");

crates/matrix-sdk-base/src/event_cache/store/traits.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,12 @@ pub trait EventCacheStore: AsyncTraitDeps {
154154
filter: Option<&[RelationType]>,
155155
) -> Result<Vec<(Event, Option<Position>)>, Self::Error>;
156156

157+
/// Get all events in this room.
158+
///
159+
/// This method must return events saved either in any linked chunks, *or*
160+
/// events saved "out-of-band" with the [`Self::save_event`] method.
161+
async fn get_room_events(&self, room_id: &RoomId) -> Result<Vec<Event>, Self::Error>;
162+
157163
/// Save an event, that might or might not be part of an existing linked
158164
/// chunk.
159165
///
@@ -258,6 +264,10 @@ impl<T: EventCacheStore> EventCacheStore for EraseEventCacheStoreError<T> {
258264
self.0.find_event_relations(room_id, event_id, filter).await.map_err(Into::into)
259265
}
260266

267+
async fn get_room_events(&self, room_id: &RoomId) -> Result<Vec<Event>, Self::Error> {
268+
self.0.get_room_events(room_id).await.map_err(Into::into)
269+
}
270+
261271
async fn save_event(&self, room_id: &RoomId, event: Event) -> Result<(), Self::Error> {
262272
self.0.save_event(room_id, event).await.map_err(Into::into)
263273
}

crates/matrix-sdk-indexeddb/src/event_cache_store/mod.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,21 @@ impl EventCacheStore for IndexeddbEventCacheStore {
469469
Ok(related_events)
470470
}
471471

472+
#[instrument(skip(self))]
473+
async fn get_room_events(
474+
&self,
475+
room_id: &RoomId,
476+
) -> Result<Vec<Event>, IndexeddbEventCacheStoreError> {
477+
let _timer = timer!("method");
478+
479+
let transaction = self.transaction(&[keys::EVENTS], IdbTransactionMode::Readonly)?;
480+
transaction
481+
.get_room_events(room_id)
482+
.await
483+
.map(|vec| vec.into_iter().map(Into::into).collect())
484+
.map_err(Into::into)
485+
}
486+
472487
#[instrument(skip(self, event))]
473488
async fn save_event(
474489
&self,

crates/matrix-sdk-indexeddb/src/event_cache_store/transaction.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::event_cache_store::{
3232
types::{
3333
IndexedChunkIdKey, IndexedEventIdKey, IndexedEventPositionKey, IndexedEventRelationKey,
3434
IndexedEventRoomKey, IndexedGapIdKey, IndexedKeyRange, IndexedLeaseIdKey,
35-
IndexedNextChunkIdKey,
35+
IndexedNextChunkIdKey, IndexedRoomId,
3636
},
3737
IndexeddbEventCacheStoreSerializer,
3838
},
@@ -677,6 +677,15 @@ impl<'a> IndexeddbEventCacheStoreTransaction<'a> {
677677
self.get_item_by_key::<Event, IndexedEventRoomKey>(key).await
678678
}
679679

680+
/// Query IndexedDB for events that are in the given
681+
/// room.
682+
pub async fn get_room_events(
683+
&self,
684+
room_id: &RoomId,
685+
) -> Result<Vec<Event>, IndexeddbEventCacheStoreTransactionError> {
686+
self.get_items_in_room::<Event, IndexedEventRoomKey>(room_id).await
687+
}
688+
680689
/// Query IndexedDB for events in the given position range matching the
681690
/// given linked chunk id.
682691
pub async fn get_events_by_position(

crates/matrix-sdk-sqlite/src/event_cache_store.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,6 +1282,32 @@ impl EventCacheStore for SqliteEventCacheStore {
12821282
.await
12831283
}
12841284

1285+
#[instrument(skip(self))]
1286+
async fn get_room_events(&self, room_id: &RoomId) -> Result<Vec<Event>, Self::Error> {
1287+
let _timer = timer!("method");
1288+
1289+
let this = self.clone();
1290+
1291+
let hashed_room_id = self.encode_key(keys::LINKED_CHUNKS, room_id);
1292+
1293+
self.read()
1294+
.await?
1295+
.with_transaction(move |txn| -> Result<_> {
1296+
let mut statement = txn.prepare("SELECT content FROM events WHERE room_id = ?")?;
1297+
let maybe_events =
1298+
statement.query_map((hashed_room_id,), |row| row.get::<_, Vec<u8>>(0))?;
1299+
1300+
let mut events = Vec::new();
1301+
for ev in maybe_events {
1302+
let event = serde_json::from_slice(&this.decode_value(&ev?)?)?;
1303+
events.push(event);
1304+
}
1305+
1306+
Ok(events)
1307+
})
1308+
.await
1309+
}
1310+
12851311
#[instrument(skip(self, event))]
12861312
async fn save_event(&self, room_id: &RoomId, event: Event) -> Result<(), Self::Error> {
12871313
let _timer = timer!("method");

0 commit comments

Comments
 (0)