Skip to main content

tuwunel_api_admin/devices/
update_device.rs

1use 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
8/// Synapse's `MAX_DEVICE_DISPLAY_NAME_LEN`.
9const MAX_DISPLAY_NAME_LEN: usize = 100;
10
11/// # `PUT /_synapse/admin/v2/users/{user_id}/devices/{device_id}`
12///
13/// Only `display_name` is honored; an omitted one leaves it unchanged.
14pub(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}