Skip to content

Commit 0d06313

Browse files
committed
feat(base): Add methods for MediaRetentionPolicy to EventCacheStore
Signed-off-by: Kévin Commaille <[email protected]>
1 parent 62422a4 commit 0d06313

File tree

7 files changed

+181
-25
lines changed

7 files changed

+181
-25
lines changed

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

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use ruma::{
3232
push::Action, room_id, uint, RoomId,
3333
};
3434

35-
use super::DynEventCacheStore;
35+
use super::{media::IgnoreMediaRetentionPolicy, DynEventCacheStore};
3636
use crate::{
3737
event_cache::{Event, Gap},
3838
media::{MediaFormat, MediaRequestParameters, MediaThumbnailSettings},
@@ -168,7 +168,9 @@ impl EventCacheStoreIntegrationTests for DynEventCacheStore {
168168
);
169169

170170
// Let's add the media.
171-
self.add_media_content(&request_file, content.clone()).await.expect("adding media failed");
171+
self.add_media_content(&request_file, content.clone(), IgnoreMediaRetentionPolicy::No)
172+
.await
173+
.expect("adding media failed");
172174

173175
// Media is present in the cache.
174176
assert_eq!(
@@ -196,7 +198,7 @@ impl EventCacheStoreIntegrationTests for DynEventCacheStore {
196198
);
197199

198200
// Let's add the media again.
199-
self.add_media_content(&request_file, content.clone())
201+
self.add_media_content(&request_file, content.clone(), IgnoreMediaRetentionPolicy::No)
200202
.await
201203
.expect("adding media again failed");
202204

@@ -207,9 +209,13 @@ impl EventCacheStoreIntegrationTests for DynEventCacheStore {
207209
);
208210

209211
// Let's add the thumbnail media.
210-
self.add_media_content(&request_thumbnail, thumbnail_content.clone())
211-
.await
212-
.expect("adding thumbnail failed");
212+
self.add_media_content(
213+
&request_thumbnail,
214+
thumbnail_content.clone(),
215+
IgnoreMediaRetentionPolicy::No,
216+
)
217+
.await
218+
.expect("adding thumbnail failed");
213219

214220
// Media's thumbnail is present.
215221
assert_eq!(
@@ -225,9 +231,13 @@ impl EventCacheStoreIntegrationTests for DynEventCacheStore {
225231
);
226232

227233
// Let's add another media with a different URI.
228-
self.add_media_content(&request_other_file, other_content.clone())
229-
.await
230-
.expect("adding other media failed");
234+
self.add_media_content(
235+
&request_other_file,
236+
other_content.clone(),
237+
IgnoreMediaRetentionPolicy::No,
238+
)
239+
.await
240+
.expect("adding other media failed");
231241

232242
// Other file is present.
233243
assert_eq!(
@@ -279,7 +289,9 @@ impl EventCacheStoreIntegrationTests for DynEventCacheStore {
279289
assert!(self.get_media_content(&req).await.unwrap().is_none(), "unexpected media found");
280290

281291
// Add the media.
282-
self.add_media_content(&req, content.clone()).await.expect("adding media failed");
292+
self.add_media_content(&req, content.clone(), IgnoreMediaRetentionPolicy::No)
293+
.await
294+
.expect("adding media failed");
283295

284296
// Sanity-check: media is found after adding it.
285297
assert_eq!(self.get_media_content(&req).await.unwrap().unwrap(), b"hello");

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

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,9 @@ impl EventCacheStore for MemoryStore {
143143
&self,
144144
request: &MediaRequestParameters,
145145
data: Vec<u8>,
146+
ignore_policy: IgnoreMediaRetentionPolicy,
146147
) -> Result<()> {
147-
self.media_service
148-
.add_media_content(self, request, data, IgnoreMediaRetentionPolicy::No)
149-
.await
148+
self.media_service.add_media_content(self, request, data, ignore_policy).await
150149
}
151150

152151
async fn replace_media_key(
@@ -214,6 +213,29 @@ impl EventCacheStore for MemoryStore {
214213

215214
Ok(())
216215
}
216+
217+
async fn set_media_retention_policy(
218+
&self,
219+
policy: MediaRetentionPolicy,
220+
) -> Result<(), Self::Error> {
221+
self.media_service.set_media_retention_policy(self, policy).await
222+
}
223+
224+
fn media_retention_policy(&self) -> MediaRetentionPolicy {
225+
self.media_service.media_retention_policy()
226+
}
227+
228+
async fn set_ignore_media_retention_policy(
229+
&self,
230+
request: &MediaRequestParameters,
231+
ignore_policy: IgnoreMediaRetentionPolicy,
232+
) -> Result<(), Self::Error> {
233+
self.media_service.set_ignore_media_retention_policy(self, request, ignore_policy).await
234+
}
235+
236+
async fn clean_up_media_cache(&self) -> Result<(), Self::Error> {
237+
self.media_service.clean_up_media_cache(self).await
238+
}
217239
}
218240

219241
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]

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

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ use matrix_sdk_common::{
2121
};
2222
use ruma::{MxcUri, RoomId};
2323

24-
use super::EventCacheStoreError;
24+
use super::{
25+
media::{IgnoreMediaRetentionPolicy, MediaRetentionPolicy},
26+
EventCacheStoreError,
27+
};
2528
use crate::{
2629
event_cache::{Event, Gap},
2730
media::MediaRequestParameters,
@@ -88,6 +91,7 @@ pub trait EventCacheStore: AsyncTraitDeps {
8891
&self,
8992
request: &MediaRequestParameters,
9093
content: Vec<u8>,
94+
ignore_policy: IgnoreMediaRetentionPolicy,
9195
) -> Result<(), Self::Error>;
9296

9397
/// Replaces the given media's content key with another one.
@@ -162,6 +166,42 @@ pub trait EventCacheStore: AsyncTraitDeps {
162166
///
163167
/// * `uri` - The `MxcUri` of the media files.
164168
async fn remove_media_content_for_uri(&self, uri: &MxcUri) -> Result<(), Self::Error>;
169+
170+
/// Set the `MediaRetentionPolicy` to use for deciding whether to store or
171+
/// keep media content.
172+
///
173+
/// # Arguments
174+
///
175+
/// * `policy` - The `MediaRetentionPolicy` to use.
176+
async fn set_media_retention_policy(
177+
&self,
178+
policy: MediaRetentionPolicy,
179+
) -> Result<(), Self::Error>;
180+
181+
/// Get the current `MediaRetentionPolicy`.
182+
fn media_retention_policy(&self) -> MediaRetentionPolicy;
183+
184+
/// Set whether the current [`MediaRetentionPolicy`] should be ignored for
185+
/// the media.
186+
///
187+
/// The change will be taken into account in the next cleanup.
188+
///
189+
/// # Arguments
190+
///
191+
/// * `request` - The `MediaRequestParameters` of the file.
192+
///
193+
/// * `ignore_policy` - Whether the current `MediaRetentionPolicy` should be
194+
/// ignored.
195+
async fn set_ignore_media_retention_policy(
196+
&self,
197+
request: &MediaRequestParameters,
198+
ignore_policy: IgnoreMediaRetentionPolicy,
199+
) -> Result<(), Self::Error>;
200+
201+
/// Clean up the media cache with the current `MediaRetentionPolicy`.
202+
///
203+
/// If there is already an ongoing cleanup, this is a noop.
204+
async fn clean_up_media_cache(&self) -> Result<(), Self::Error>;
165205
}
166206

167207
#[repr(transparent)]
@@ -211,8 +251,9 @@ impl<T: EventCacheStore> EventCacheStore for EraseEventCacheStoreError<T> {
211251
&self,
212252
request: &MediaRequestParameters,
213253
content: Vec<u8>,
254+
ignore_policy: IgnoreMediaRetentionPolicy,
214255
) -> Result<(), Self::Error> {
215-
self.0.add_media_content(request, content).await.map_err(Into::into)
256+
self.0.add_media_content(request, content, ignore_policy).await.map_err(Into::into)
216257
}
217258

218259
async fn replace_media_key(
@@ -247,6 +288,29 @@ impl<T: EventCacheStore> EventCacheStore for EraseEventCacheStoreError<T> {
247288
async fn remove_media_content_for_uri(&self, uri: &MxcUri) -> Result<(), Self::Error> {
248289
self.0.remove_media_content_for_uri(uri).await.map_err(Into::into)
249290
}
291+
292+
async fn set_media_retention_policy(
293+
&self,
294+
policy: MediaRetentionPolicy,
295+
) -> Result<(), Self::Error> {
296+
self.0.set_media_retention_policy(policy).await.map_err(Into::into)
297+
}
298+
299+
fn media_retention_policy(&self) -> MediaRetentionPolicy {
300+
self.0.media_retention_policy()
301+
}
302+
303+
async fn set_ignore_media_retention_policy(
304+
&self,
305+
request: &MediaRequestParameters,
306+
ignore_policy: IgnoreMediaRetentionPolicy,
307+
) -> Result<(), Self::Error> {
308+
self.0.set_ignore_media_retention_policy(request, ignore_policy).await.map_err(Into::into)
309+
}
310+
311+
async fn clean_up_media_cache(&self) -> Result<(), Self::Error> {
312+
self.0.clean_up_media_cache().await.map_err(Into::into)
313+
}
250314
}
251315

252316
/// A type-erased [`EventCacheStore`].

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

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -623,10 +623,9 @@ impl EventCacheStore for SqliteEventCacheStore {
623623
&self,
624624
request: &MediaRequestParameters,
625625
content: Vec<u8>,
626+
ignore_policy: IgnoreMediaRetentionPolicy,
626627
) -> Result<()> {
627-
self.media_service
628-
.add_media_content(self, request, content, IgnoreMediaRetentionPolicy::No)
629-
.await
628+
self.media_service.add_media_content(self, request, content, ignore_policy).await
630629
}
631630

632631
async fn replace_media_key(
@@ -679,6 +678,29 @@ impl EventCacheStore for SqliteEventCacheStore {
679678

680679
Ok(())
681680
}
681+
682+
async fn set_media_retention_policy(
683+
&self,
684+
policy: MediaRetentionPolicy,
685+
) -> Result<(), Self::Error> {
686+
self.media_service.set_media_retention_policy(self, policy).await
687+
}
688+
689+
fn media_retention_policy(&self) -> MediaRetentionPolicy {
690+
self.media_service.media_retention_policy()
691+
}
692+
693+
async fn set_ignore_media_retention_policy(
694+
&self,
695+
request: &MediaRequestParameters,
696+
ignore_policy: IgnoreMediaRetentionPolicy,
697+
) -> Result<(), Self::Error> {
698+
self.media_service.set_ignore_media_retention_policy(self, request, ignore_policy).await
699+
}
700+
701+
async fn clean_up_media_cache(&self) -> Result<(), Self::Error> {
702+
self.media_service.clean_up_media_cache(self).await
703+
}
682704
}
683705

684706
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
@@ -1056,6 +1078,7 @@ mod tests {
10561078
event_cache::{
10571079
store::{
10581080
integration_tests::{check_test_event, make_test_event},
1081+
media::IgnoreMediaRetentionPolicy,
10591082
EventCacheStore, EventCacheStoreError,
10601083
},
10611084
Gap,
@@ -1123,7 +1146,7 @@ mod tests {
11231146

11241147
// Add the media.
11251148
event_cache_store
1126-
.add_media_content(&file_request, content.clone())
1149+
.add_media_content(&file_request, content.clone(), IgnoreMediaRetentionPolicy::No)
11271150
.await
11281151
.expect("adding file failed");
11291152

@@ -1132,7 +1155,11 @@ mod tests {
11321155
tokio::time::sleep(Duration::from_secs(3)).await;
11331156

11341157
event_cache_store
1135-
.add_media_content(&thumbnail_request, thumbnail_content.clone())
1158+
.add_media_content(
1159+
&thumbnail_request,
1160+
thumbnail_content.clone(),
1161+
IgnoreMediaRetentionPolicy::No,
1162+
)
11361163
.await
11371164
.expect("adding thumbnail failed");
11381165

crates/matrix-sdk/src/media.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use std::{fmt, fs::File, path::Path};
2323

2424
use eyeball::SharedObservable;
2525
use futures_util::future::try_join;
26+
use matrix_sdk_base::event_cache::store::media::IgnoreMediaRetentionPolicy;
2627
pub use matrix_sdk_base::media::*;
2728
use mime::Mime;
2829
use ruma::{
@@ -518,7 +519,7 @@ impl Media {
518519
.event_cache_store()
519520
.lock()
520521
.await?
521-
.add_media_content(request, content.clone())
522+
.add_media_content(request, content.clone(), IgnoreMediaRetentionPolicy::No)
522523
.await?;
523524
}
524525

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use matrix_sdk_base::{
4040
deserialized_responses::{
4141
RawAnySyncOrStrippedState, RawSyncOrStrippedState, SyncOrStrippedState, TimelineEvent,
4242
},
43+
event_cache::store::media::IgnoreMediaRetentionPolicy,
4344
media::MediaThumbnailSettings,
4445
store::StateStoreExt,
4546
ComposerDraft, RoomInfoNotableUpdateReasons, RoomMemberships, StateChanges, StateStoreDataKey,
@@ -2034,7 +2035,10 @@ impl Room {
20342035
let request =
20352036
MediaRequestParameters { source: media_source.clone(), format: MediaFormat::File };
20362037

2037-
if let Err(err) = cache_store_lock_guard.add_media_content(&request, data).await {
2038+
if let Err(err) = cache_store_lock_guard
2039+
.add_media_content(&request, data, IgnoreMediaRetentionPolicy::No)
2040+
.await
2041+
{
20382042
warn!("unable to cache the media after uploading it: {err}");
20392043
}
20402044

@@ -2048,7 +2052,10 @@ impl Room {
20482052
format: MediaFormat::Thumbnail(MediaThumbnailSettings::new(width, height)),
20492053
};
20502054

2051-
if let Err(err) = cache_store_lock_guard.add_media_content(&request, data).await {
2055+
if let Err(err) = cache_store_lock_guard
2056+
.add_media_content(&request, data, IgnoreMediaRetentionPolicy::No)
2057+
.await
2058+
{
20522059
warn!("unable to cache the media after uploading it: {err}");
20532060
}
20542061
}

0 commit comments

Comments
 (0)