Skip to main content

tuwunel_service/migrations/
remove_remote_media_userid.rs

1use ruma::{MxcUri, UserId};
2use tuwunel_core::{
3	Result, info,
4	utils::{ReadyExt, stream::TryExpect},
5	warn,
6};
7
8use crate::Services;
9
10pub(super) async fn remove_remote_media_userid(services: &Services) -> Result {
11	let db = &services.db;
12	let cork = db.cork_and_sync();
13	let mediaid_user = db["mediaid_user"].clone();
14
15	warn!("Removing stored user id for remote media");
16
17	let (checked, removed_remote, removed_invalid) = mediaid_user
18		.keys()
19		.expect_ok()
20		.ready_fold(
21			(0, 0, 0),
22			|(mut checked, mut removed_remote, mut removed_invalid): (usize, usize, usize),
23			 (mxc_uri, user_id): (&MxcUri, &UserId)| {
24				checked = checked.saturating_add(1);
25
26				let Ok(mxc) = mxc_uri.parts() else {
27					warn!(?mxc_uri, "Invalid MXC URL, removing it");
28
29					mediaid_user.del((mxc_uri, user_id));
30
31					removed_invalid = removed_invalid.saturating_add(1);
32
33					return (checked, removed_remote, removed_invalid);
34				};
35
36				if !services.globals.server_is_ours(mxc.server_name) {
37					mediaid_user.del((mxc_uri, user_id));
38
39					removed_remote = removed_remote.saturating_add(1);
40
41					return (checked, removed_remote, removed_invalid);
42				}
43
44				(checked, removed_remote, removed_invalid)
45			},
46		)
47		.await;
48
49	drop(cork);
50	info!(
51		%checked,
52		%removed_remote,
53		%removed_invalid,
54		"Removed stored user id for remote media"
55	);
56
57	db["global"].insert(b"remove_remote_media_userid", []);
58	mediaid_user.sort()
59}