tuwunel_api_admin/devices/
list_devices.rs1use 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
9pub(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}