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