pub mod unstable {
use ruma_common::{
OwnedRoomId, OwnedTransactionId,
api::{auth_scheme::AccessToken, request, response},
metadata,
serde::Raw,
};
use ruma_events::{AnyMessageLikeEventContent, MessageLikeEventContent, MessageLikeEventType};
use serde_json::value::to_raw_value as to_raw_json_value;
use crate::delayed_events::DelayParameters;
metadata! {
method: PUT,
rate_limited: false,
authentication: AccessToken,
history: {
unstable => "/_matrix/client/v3/rooms/{room_id}/send/{event_type}/{txn_id}",
}
}
#[request(error = crate::Error)]
pub struct Request {
#[ruma_api(path)]
pub room_id: OwnedRoomId,
#[ruma_api(path)]
pub event_type: MessageLikeEventType,
#[ruma_api(path)]
pub txn_id: OwnedTransactionId,
#[ruma_api(query_all)]
pub delay_parameters: DelayParameters,
#[ruma_api(body)]
pub body: Raw<AnyMessageLikeEventContent>,
}
#[response(error = crate::Error)]
pub struct Response {
pub delay_id: String,
}
impl Request {
pub fn new<T>(
room_id: OwnedRoomId,
txn_id: OwnedTransactionId,
delay_parameters: DelayParameters,
content: &T,
) -> serde_json::Result<Self>
where
T: MessageLikeEventContent,
{
Ok(Self {
room_id,
txn_id,
event_type: content.event_type(),
delay_parameters,
body: Raw::from_json(to_raw_json_value(content)?),
})
}
pub fn new_raw(
room_id: OwnedRoomId,
txn_id: OwnedTransactionId,
event_type: MessageLikeEventType,
delay_parameters: DelayParameters,
body: Raw<AnyMessageLikeEventContent>,
) -> Self {
Self { room_id, event_type, txn_id, delay_parameters, body }
}
}
impl Response {
pub fn new(delay_id: String) -> Self {
Self { delay_id }
}
}
#[cfg(all(test, feature = "client"))]
mod tests {
use std::borrow::Cow;
use ruma_common::{
api::{
MatrixVersion, OutgoingRequest, SupportedVersions, auth_scheme::SendAccessToken,
},
owned_room_id,
};
use ruma_events::room::message::RoomMessageEventContent;
use serde_json::{Value as JsonValue, json};
use web_time::Duration;
use super::Request;
use crate::delayed_events::delayed_message_event::unstable::DelayParameters;
#[test]
fn serialize_delayed_message_request() {
let room_id = owned_room_id!("!roomid:example.org");
let supported = SupportedVersions {
versions: [MatrixVersion::V1_1].into(),
features: Default::default(),
};
let req = Request::new(
room_id,
"1234".into(),
DelayParameters::Timeout { timeout: Duration::from_millis(103) },
&RoomMessageEventContent::text_plain("test"),
)
.unwrap();
let request: http::Request<Vec<u8>> = req
.try_into_http_request(
"https://homeserver.tld",
SendAccessToken::IfRequired("auth_tok"),
Cow::Owned(supported),
)
.unwrap();
let (parts, body) = request.into_parts();
assert_eq!(
"https://homeserver.tld/_matrix/client/v3/rooms/!roomid:example.org/send/m.room.message/1234?org.matrix.msc4140.delay=103",
parts.uri.to_string()
);
assert_eq!("PUT", parts.method.to_string());
assert_eq!(
json!({"msgtype":"m.text","body":"test"}),
serde_json::from_str::<JsonValue>(std::str::from_utf8(&body).unwrap()).unwrap()
);
}
}
}