Skip to main content

tuwunel_api_admin/devices/
list_devices.rs

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