Skip to main content

tuwunel_admin/query/
room_timeline.rs

1use clap::Subcommand;
2use futures::TryStreamExt;
3use ruma::OwnedRoomOrAliasId;
4use tuwunel_core::{PduCount, Result, utils::stream::TryTools};
5
6use crate::{admin_command, admin_command_dispatch};
7
8#[admin_command_dispatch]
9#[derive(Debug, Subcommand)]
10/// Query tables from database
11pub(crate) enum RoomTimelineCommand {
12	Pdus {
13		room_id: OwnedRoomOrAliasId,
14
15		from: Option<String>,
16
17		#[arg(short, long)]
18		limit: Option<usize>,
19	},
20
21	Last {
22		room_id: OwnedRoomOrAliasId,
23	},
24}
25
26#[admin_command]
27pub(super) async fn last(&self, room_id: OwnedRoomOrAliasId) -> Result {
28	let room_id = self
29		.services
30		.alias
31		.maybe_resolve(&room_id)
32		.await?;
33
34	let result = self
35		.services
36		.timeline
37		.last_timeline_count(None, &room_id, None)
38		.await?;
39
40	self.write_str(&format!("{result:#?}")).await
41}
42
43#[admin_command]
44pub(super) async fn pdus(
45	&self,
46	room_id: OwnedRoomOrAliasId,
47	from: Option<String>,
48	limit: Option<usize>,
49) -> Result {
50	let room_id = self
51		.services
52		.alias
53		.maybe_resolve(&room_id)
54		.await?;
55
56	let from: Option<PduCount> = from.as_deref().map(str::parse).transpose()?;
57
58	let result: Vec<_> = self
59		.services
60		.timeline
61		.pdus_rev(None, &room_id, from)
62		.try_take(limit.unwrap_or(3))
63		.try_collect()
64		.await?;
65
66	self.write_str(&format!("{result:#?}")).await
67}