Skip to main content

tuwunel_admin/user/
set_profile_key.rs

1use 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}