tuwunel_admin/debug/
get_auth_chain.rs1use 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}