synapse_admin_api/experimental_features/enable_features/
v1.rs

1//! [PUT /_synapse/admin/v1/experimental_features/:user_id](https://github.com/element-hq/synapse/blob/master/docs/admin_api/experimental_features.md#enablingdisabling-features)
2
3use ruma::{
4    OwnedUserId,
5    api::{auth_scheme::AccessToken, request, response},
6    metadata,
7};
8use serde::{Deserialize, Serialize};
9
10metadata! {
11    method: PUT,
12    rate_limited: false,
13    authentication: AccessToken,
14    path: "/_synapse/admin/v1/experimental_features/{user_id}",
15}
16
17#[request]
18#[derive(Serialize, Deserialize, PartialEq)]
19pub struct Request {
20    /// User ID.
21    #[ruma_api(path)]
22    pub user_id: OwnedUserId,
23    /// Experimental features per user.
24    pub features: ExperimentalFeatures,
25}
26
27#[derive(Serialize, Deserialize, Clone, PartialEq, Debug, Default)]
28#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
29pub struct ExperimentalFeatures {
30    /// Whether busy presence state is enabled.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub msc3026: Option<bool>,
33    /// Whether remotely toggling push notifications for another client is enabled.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub msc3881: Option<bool>,
36    /// Do not require UIA when first uploading cross-signing keys.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub msc3967: Option<bool>,
39}
40
41impl ExperimentalFeatures {
42    /// Construct an empty `ExperimentalFeatures`.
43    pub fn new() -> Self {
44        Self::default()
45    }
46}
47
48#[response]
49#[derive(Default)]
50pub struct Response {}
51
52impl Request {
53    /// Creates a `Request` with the given user ID and experimental features to enable or
54    /// disable for a user.
55    pub fn new(user_id: OwnedUserId, features: ExperimentalFeatures) -> Self {
56        Self { user_id, features }
57    }
58}
59
60impl Response {
61    /// Creates an empty `Response`.
62    pub fn new() -> Self {
63        Self {}
64    }
65}
66
67#[test]
68fn test_enable_features() {
69    use std::convert::TryFrom;
70
71    use ruma::UserId;
72
73    let features =
74        ExperimentalFeatures { msc3026: Option::from(true), msc3881: None, msc3967: None };
75
76    let user_id: &UserId =
77        <&UserId>::try_from("@carl:example.com").expect("Failed to create UserId.");
78
79    // Check create request
80    let request = Request::new(user_id.to_owned(), features);
81
82    // Serialize
83    let serialized = serde_json::to_string(&request).expect("Failed to serialize");
84    assert_eq!(serialized, "{\"user_id\":\"@carl:example.com\",\"features\":{\"msc3026\":true}}");
85
86    // Deserialize
87    let deserialized: Request = serde_json::from_str(&serialized).expect("Failed to deserialize");
88    assert_eq!(deserialized, request);
89}