Skip to main content

tuwunel_api/client/admin/rooms/
context.rs

1use axum::extract::State;
2use ruma::api::client::filter::RoomEventFilter;
3use synapse_admin_api::rooms::admin_context::v1::{Request, Response};
4use tuwunel_core::Result;
5
6use crate::{
7	Ruma,
8	client::{
9		admin::require_admin,
10		context::{ContextArgs, event_context},
11	},
12};
13
14/// # `GET /_synapse/admin/v1/rooms/{room_id}/context/{event_id}`
15///
16/// Loads the timeline window around an event with admin privilege, skipping the
17/// visibility and ignore checks the client-server context endpoint applies.
18pub(crate) async fn admin_room_context_route(
19	State(services): State<crate::State>,
20	body: Ruma<Request>,
21) -> Result<Response> {
22	require_admin(&services, body.sender_user()).await?;
23
24	let filter: RoomEventFilter = body
25		.filter
26		.as_deref()
27		.map(serde_json::from_str)
28		.transpose()?
29		.unwrap_or_default();
30
31	let response = event_context(&services, ContextArgs {
32		room_id: &body.room_id,
33		event_id: &body.event_id,
34		sender_user: body.sender_user(),
35		sender_device: body.sender_device.as_deref(),
36		filter: &filter,
37		limit: body.limit,
38		bypass_visibility: true,
39	})
40	.await?;
41
42	Ok(Response {
43		start: response.start.unwrap_or_default(),
44		end: response.end.unwrap_or_default(),
45		events_before: response.events_before,
46		event: response.event,
47		events_after: response.events_after,
48		state: response.state,
49	})
50}