Skip to main content

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