Skip to content

Commit 94e5ee7

Browse files
committed
fix(sdk): Remove a room from the store on forget
1 parent d455b0d commit 94e5ee7

File tree

4 files changed

+149
-0
lines changed

4 files changed

+149
-0
lines changed

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,24 @@ impl MemoryStore {
438438

439439
Ok(())
440440
}
441+
442+
async fn remove_room(&self, room_id: &RoomId) -> Result<()> {
443+
self.members.remove(room_id);
444+
self.profiles.remove(room_id);
445+
self.display_names.remove(room_id);
446+
self.joined_user_ids.remove(room_id);
447+
self.invited_user_ids.remove(room_id);
448+
self.room_info.remove(room_id);
449+
self.room_state.remove(room_id);
450+
self.room_account_data.remove(room_id);
451+
self.stripped_room_info.remove(room_id);
452+
self.stripped_room_state.remove(room_id);
453+
self.stripped_members.remove(room_id);
454+
self.room_user_receipts.remove(room_id);
455+
self.room_event_receipts.remove(room_id);
456+
457+
Ok(())
458+
}
441459
}
442460

443461
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
@@ -584,6 +602,10 @@ impl StateStore for MemoryStore {
584602
async fn remove_media_content_for_uri(&self, uri: &MxcUri) -> Result<()> {
585603
self.remove_media_content_for_uri(uri).await
586604
}
605+
606+
async fn remove_room(&self, room_id: &RoomId) -> Result<()> {
607+
self.remove_room(room_id).await
608+
}
587609
}
588610

589611
#[cfg(test)]

crates/matrix-sdk-base/src/store/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,13 @@ pub trait StateStore: AsyncTraitDeps {
313313
///
314314
/// * `uri` - The `MxcUri` of the media files.
315315
async fn remove_media_content_for_uri(&self, uri: &MxcUri) -> Result<()>;
316+
317+
/// Removes a room and all elements associated from the state store.
318+
///
319+
/// # Arguments
320+
///
321+
/// * `room_id` - The `RoomId` of the room to delete.
322+
async fn remove_room(&self, room_id: &RoomId) -> Result<()>;
316323
}
317324

318325
/// A state store wrapper for the SDK.

crates/matrix-sdk-base/src/store/sled_store/mod.rs

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,121 @@ impl SledStore {
846846

847847
Ok(self.media.apply_batch(batch)?)
848848
}
849+
850+
async fn remove_room(&self, room_id: &RoomId) -> Result<()> {
851+
let room_key = room_id.encode();
852+
853+
let mut members_batch = sled::Batch::default();
854+
for key in self.members.scan_prefix(room_key.as_slice()).keys() {
855+
members_batch.remove(key?)
856+
}
857+
858+
let mut profiles_batch = sled::Batch::default();
859+
for key in self.profiles.scan_prefix(room_key.as_slice()).keys() {
860+
profiles_batch.remove(key?)
861+
}
862+
863+
let mut display_names_batch = sled::Batch::default();
864+
for key in self.display_names.scan_prefix(room_key.as_slice()).keys() {
865+
display_names_batch.remove(key?)
866+
}
867+
868+
let mut joined_user_ids_batch = sled::Batch::default();
869+
for key in self.joined_user_ids.scan_prefix(room_key.as_slice()).keys() {
870+
joined_user_ids_batch.remove(key?)
871+
}
872+
873+
let mut invited_user_ids_batch = sled::Batch::default();
874+
for key in self.invited_user_ids.scan_prefix(room_key.as_slice()).keys() {
875+
invited_user_ids_batch.remove(key?)
876+
}
877+
878+
let mut room_state_batch = sled::Batch::default();
879+
for key in self.room_state.scan_prefix(room_key.as_slice()).keys() {
880+
room_state_batch.remove(key?)
881+
}
882+
883+
let mut room_account_data_batch = sled::Batch::default();
884+
for key in self.room_account_data.scan_prefix(room_key.as_slice()).keys() {
885+
room_account_data_batch.remove(key?)
886+
}
887+
888+
let mut stripped_members_batch = sled::Batch::default();
889+
for key in self.stripped_members.scan_prefix(room_key.as_slice()).keys() {
890+
stripped_members_batch.remove(key?)
891+
}
892+
893+
let mut stripped_room_state_batch = sled::Batch::default();
894+
for key in self.stripped_room_state.scan_prefix(room_key.as_slice()).keys() {
895+
stripped_room_state_batch.remove(key?)
896+
}
897+
898+
let mut room_user_receipts_batch = sled::Batch::default();
899+
for key in self.room_user_receipts.scan_prefix(room_key.as_slice()).keys() {
900+
room_user_receipts_batch.remove(key?)
901+
}
902+
903+
let mut room_event_receipts_batch = sled::Batch::default();
904+
for key in self.room_event_receipts.scan_prefix(room_key.as_slice()).keys() {
905+
room_event_receipts_batch.remove(key?)
906+
}
907+
908+
let ret: Result<(), TransactionError<SerializationError>> = (
909+
&self.members,
910+
&self.profiles,
911+
&self.display_names,
912+
&self.joined_user_ids,
913+
&self.invited_user_ids,
914+
&self.room_info,
915+
&self.room_state,
916+
&self.room_account_data,
917+
&self.stripped_room_info,
918+
&self.stripped_members,
919+
&self.stripped_room_state,
920+
&self.room_user_receipts,
921+
&self.room_event_receipts,
922+
)
923+
.transaction(
924+
|(
925+
members,
926+
profiles,
927+
display_names,
928+
joined,
929+
invited,
930+
rooms,
931+
state,
932+
room_account_data,
933+
stripped_rooms,
934+
stripped_members,
935+
stripped_state,
936+
room_user_receipts,
937+
room_event_receipts,
938+
)| {
939+
rooms.remove(room_key.as_slice())?;
940+
stripped_rooms.remove(room_key.as_slice())?;
941+
942+
members.apply_batch(&members_batch)?;
943+
profiles.apply_batch(&profiles_batch)?;
944+
display_names.apply_batch(&display_names_batch)?;
945+
joined.apply_batch(&joined_user_ids_batch)?;
946+
invited.apply_batch(&invited_user_ids_batch)?;
947+
state.apply_batch(&room_state_batch)?;
948+
room_account_data.apply_batch(&room_account_data_batch)?;
949+
stripped_members.apply_batch(&stripped_members_batch)?;
950+
stripped_state.apply_batch(&stripped_room_state_batch)?;
951+
room_user_receipts.apply_batch(&room_user_receipts_batch)?;
952+
room_event_receipts.apply_batch(&room_event_receipts_batch)?;
953+
954+
Ok(())
955+
},
956+
);
957+
958+
ret?;
959+
960+
self.inner.flush_async().await?;
961+
962+
Ok(())
963+
}
849964
}
850965

851966
#[async_trait]
@@ -987,6 +1102,10 @@ impl StateStore for SledStore {
9871102
async fn remove_media_content_for_uri(&self, uri: &MxcUri) -> Result<()> {
9881103
self.remove_media_content_for_uri(uri).await
9891104
}
1105+
1106+
async fn remove_room(&self, room_id: &RoomId) -> Result<()> {
1107+
self.remove_room(room_id).await
1108+
}
9901109
}
9911110

9921111
#[cfg(test)]

crates/matrix-sdk/src/room/left.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ impl Left {
4242
pub async fn forget(&self) -> Result<()> {
4343
let request = forget_room::Request::new(self.inner.room_id());
4444
let _response = self.client.send(request, None).await?;
45+
self.client.store().remove_room(self.inner.room_id()).await?;
4546

4647
Ok(())
4748
}

0 commit comments

Comments
 (0)