Skip to main content

tuwunel_api/client/admin/devices/
list_devices.rs

1use axum::extract::State;
2use futures::StreamExt;
3use ruma::UInt;
4use synapse_admin_api::devices::list_devices::v1 as list_devices;
5use tuwunel_core::Result;
6
7use super::{device_response, require_local_user};
8use crate::{Ruma, client::admin::require_admin};
9
10/// # `GET /_synapse/admin/v2/users/{user_id}/devices`
11pub(crate) async fn admin_list_devices_route(
12	State(services): State<crate::State>,
13	body: Ruma<list_devices::Request>,
14) -> Result<list_devices::Response> {
15	require_admin(&services, body.sender_user()).await?;
16
17	let user_id = &body.user_id;
18	require_local_user(&services, user_id).await?;
19
20	let dehydrated = services
21		.users
22		.get_dehydrated_device_id(user_id)
23		.await
24		.ok();
25
26	let devices: Vec<_> = services
27		.users
28		.all_devices_metadata(user_id)
29		.map(|device| device_response(device, user_id, dehydrated.as_deref()))
30		.collect()
31		.await;
32
33	let total = UInt::try_from(devices.len()).unwrap_or(UInt::MAX);
34
35	Ok(list_devices::Response { devices, total })
36}