tuwunel_admin/user/
set_profile_key.rs1use ruma::profile::ProfileFieldValue;
2use serde_json::Value;
3use tuwunel_core::{Result, err};
4use tuwunel_service::profile::Propagation;
5
6use super::PropagateTo;
7use crate::{admin_command, utils::parse_active_local_user_id};
8
9#[admin_command]
10pub(super) async fn set_profile_key(
11 &self,
12 user_id: String,
13 key: String,
14 value: Vec<String>,
15 clear: bool,
16 propagate_to: Option<PropagateTo>,
17) -> Result {
18 let user_id = parse_active_local_user_id(self.services, &user_id).await?;
19
20 let propagation = propagate_to
21 .map(Into::into)
22 .unwrap_or(Propagation::All);
23
24 let profile_value = if clear {
25 (key.as_str().into(), None)
26 } else {
27 let value = value.join(" ");
28
29 let value = serde_json::from_str(&value).unwrap_or(Value::String(value));
30
31 let profile_value = ProfileFieldValue::new(&key, value)
32 .map_err(|e| err!("Invalid value for profile key {key:?}: {e}"))?;
33
34 (profile_value.field_name(), Some(profile_value.value().into_owned()))
35 };
36
37 self.services
38 .profile
39 .set_profile_keys(&user_id, &[profile_value], Some(propagation))
40 .await?;
41
42 if clear {
43 write!(self, "Cleared profile key {key:?} for {user_id}").await
44 } else {
45 write!(self, "Set profile key {key:?} for {user_id}").await
46 }
47}