Skip to main content

ruma_client_api/delayed_events/
get_delayed_event.rs

1//! `GET /_matrix/client/*/rooms/{roomId}/delayed_events/{delay_id}`
2//!
3//! Get the information about a delayed event.
4
5pub mod unstable {
6    //! `msc4140` ([MSC])
7    //!
8    //! [MSC]: https://github.com/matrix-org/matrix-spec-proposals/pull/4140
9
10    use ruma_common::{
11        api::{auth_scheme::AccessToken, request, response},
12        metadata,
13    };
14
15    use crate::delayed_events::DelayedEventData;
16
17    metadata! {
18        method: GET,
19        rate_limited: true,
20        authentication: AccessToken,
21        history: {
22            unstable("org.matrix.msc4140") => "/_matrix/client/unstable/org.matrix.msc4140/delayed_events/{delay_id}",
23        }
24    }
25
26    /// Request type for the [`get_delayed_event`](crate::delayed_events::get_delayed_event)
27    /// endpoint
28    #[request]
29    pub struct Request {
30        /// The ID of the requested delayed event.
31        #[ruma_api(path)]
32        pub delay_id: String,
33    }
34
35    /// Response type for the [`get_delayed_event`](crate::delayed_events::get_delayed_event)
36    /// endpoint
37    #[response]
38    pub struct Response {
39        /// The returned delayed event information
40        #[ruma_api(body)]
41        pub delayed_event: DelayedEventData,
42    }
43
44    impl Request {
45        /// Create a new Request object
46        pub fn new(delay_id: String) -> Self {
47            Self { delay_id }
48        }
49    }
50
51    impl Response {
52        /// Create a new Response object
53        pub fn new(delayed_event: DelayedEventData) -> Self {
54            Self { delayed_event }
55        }
56    }
57
58    impl From<DelayedEventData> for Response {
59        fn from(delayed_event: DelayedEventData) -> Self {
60            Self { delayed_event }
61        }
62    }
63
64    #[cfg(all(test, feature = "server"))]
65    mod server_tests {
66        use std::time::Duration;
67
68        use js_int::UInt;
69        use ruma_common::{
70            MilliSecondsSinceUnixEpoch, api::OutgoingResponse, owned_event_id, owned_room_id,
71            serde::Raw,
72        };
73        use ruma_events::TimelineEventType;
74        use serde_json::{Value as JsonValue, json};
75
76        use super::Response;
77        use crate::delayed_events::DelayedEventData;
78
79        #[test]
80        fn serialize_get_delayed_event_response() {
81            let content = json!({
82                "topic": "test topic"
83            })
84            .to_string();
85
86            let mut event_data = DelayedEventData::new(
87                "a_delay_id".to_owned(),
88                owned_room_id!("!roomid:example.org"),
89                TimelineEventType::RoomTopic,
90                Some("a_state_key".to_owned()),
91                Raw::from_json_string(content).unwrap(),
92                Duration::from_millis(103),
93                MilliSecondsSinceUnixEpoch(UInt::new(70000).unwrap()),
94            );
95            event_data.event_id = Some(owned_event_id!("$event:imaginary.hs"));
96            event_data.finalized_ts = Some(MilliSecondsSinceUnixEpoch(UInt::new(70103).unwrap()));
97
98            let response: http::Response<Vec<u8>> =
99                Response::new(event_data).try_into_http_response().unwrap();
100
101            assert_eq!(
102                json!({
103                    "content": {
104                        "topic": "test topic"
105                    },
106                    "delay": 103,
107                    "delay_id": "a_delay_id",
108                    "event_id": "$event:imaginary.hs",
109                    "finalised_ts": 70103,
110                    "room_id": "!roomid:example.org",
111                    "running_since": 70000,
112                    "state_key": "a_state_key",
113                    "type": "m.room.topic"
114                }),
115                serde_json::from_slice::<JsonValue>(response.body()).unwrap()
116            );
117        }
118    }
119
120    #[cfg(all(test, feature = "client"))]
121    mod client_tests {
122        use std::time::Duration;
123
124        use js_int::UInt;
125        use ruma_common::{
126            MilliSecondsSinceUnixEpoch, api::IncomingResponse, owned_event_id, owned_room_id,
127        };
128        use ruma_events::TimelineEventType;
129        use serde_json::{Value as JsonValue, json};
130
131        use super::Response;
132
133        #[test]
134        fn deserialize_get_delayed_event_request() {
135            let body = json!({
136                "content": {
137                    "topic": "test topic"
138                },
139                "delay": 103,
140                "delay_id": "a_delay_id",
141                "event_id": "$event:imaginary.hs",
142                "finalised_ts": 70103,
143                "room_id": "!roomid:example.org",
144                "running_since": 70000,
145                "state_key": "a_state_key",
146                "type": "m.room.topic"
147            })
148            .to_string();
149
150            let res =
151                Response::try_from_http_response(http::Response::builder().body(body).unwrap())
152                    .unwrap()
153                    .delayed_event;
154
155            let content = json!({
156                "topic": "test topic"
157            });
158
159            assert_eq!(res.delay_id, "a_delay_id".to_owned());
160            assert_eq!(res.room_id, owned_room_id!("!roomid:example.org"));
161            assert_eq!(res.event_type, TimelineEventType::RoomTopic);
162            assert_eq!(res.state_key, Some("a_state_key".to_owned()));
163            assert_eq!(res.delay, Duration::from_millis(103));
164            assert_eq!(res.running_since, MilliSecondsSinceUnixEpoch(UInt::new(70000).unwrap()));
165            assert_eq!(
166                serde_json::from_str::<JsonValue>(res.content.json().get()).unwrap(),
167                content
168            );
169            assert!(res.error.is_none());
170            assert_eq!(res.event_id, Some(owned_event_id!("$event:imaginary.hs")));
171            assert_eq!(
172                res.finalized_ts,
173                Some(MilliSecondsSinceUnixEpoch(UInt::new(70103).unwrap()))
174            );
175        }
176    }
177}