tuwunel_api_admin/devices/
update_device.rs1use axum::extract::State;
2use synapse_admin_api::devices::update_device::v1 as update_device;
3use tuwunel_core::{Err, Result, err};
4
5use super::require_local_user;
6use crate::{Ruma, require_admin};
7
8const MAX_DISPLAY_NAME_LEN: usize = 100;
10
11pub(crate) async fn admin_update_device_route(
15 State(services): State<crate::State>,
16 body: Ruma<update_device::Request>,
17) -> Result<update_device::Response> {
18 require_admin(&services, body.sender_user()).await?;
19
20 let user_id = &body.user_id;
21
22 require_local_user(&services, user_id).await?;
23
24 if services
25 .users
26 .get_device_metadata(user_id, &body.device_id)
27 .await
28 .is_err()
29 {
30 return Err!(Request(NotFound("No device found")));
31 }
32
33 let Some(display_name) = &body.display_name else {
34 return Ok(update_device::Response {});
35 };
36
37 if display_name.chars().count() > MAX_DISPLAY_NAME_LEN {
38 return Err!(Request(InvalidParam("Device display name is too long")));
39 }
40
41 services
42 .users
43 .rename_device(user_id, &body.device_id, display_name)
44 .await
45 .map_err(|_| err!(Request(NotFound("No device found"))))?;
46
47 Ok(update_device::Response {})
48}