Skip to main content

tuwunel_admin/debug/
get_auth_chain.rs

1use std::{iter::once, time::Instant};
2
3use futures::StreamExt;
4use ruma::{CanonicalJsonValue, OwnedEventId, RoomId};
5use tuwunel_core::{Err, Result, err, utils::stream::ReadyExt};
6
7use crate::admin_command;
8
9#[admin_command]
10pub(super) async fn get_auth_chain(&self, event_id: OwnedEventId) -> Result {
11	let Ok(event) = self
12		.services
13		.timeline
14		.get_pdu_json(&event_id)
15		.await
16	else {
17		return Err!("Event not found.");
18	};
19
20	let room_id_str = event
21		.get("room_id")
22		.and_then(CanonicalJsonValue::as_str)
23		.ok_or_else(|| err!(Database("Invalid event in database")))?;
24
25	let room_id = <&RoomId>::try_from(room_id_str)
26		.map_err(|_| err!(Database("Invalid room id field in event in database")))?;
27
28	let room_version = self
29		.services
30		.state
31		.get_room_version(room_id)
32		.await?;
33
34	let start = Instant::now();
35	let count = self
36		.services
37		.auth_chain
38		.event_ids_iter(room_id, &room_version, once(event_id.as_ref()))
39		.ready_filter_map(Result::ok)
40		.count()
41		.await;
42
43	let elapsed = start.elapsed();
44	let out = format!("Loaded auth chain with length {count} in {elapsed:?}");
45
46	self.write_str(&out).await
47}