diff --git a/src/client_server/config.rs b/src/client_server/config.rs
index a53b7cd..6abcba2 100644
--- a/src/client_server/config.rs
+++ b/src/client_server/config.rs
@@ -3,7 +3,7 @@ use crate::{ConduitResult, Database, Error, Ruma};
use ruma::{
api::client::{
error::ErrorKind,
- r0::config::{get_global_account_data, set_global_account_data},
+ r0::config::{get_room_account_data, get_global_account_data, set_room_account_data, set_global_account_data},
},
events::{custom::CustomEventContent, BasicEvent},
serde::Raw,
@@ -43,6 +43,37 @@ pub async fn set_global_account_data_route(
Ok(set_global_account_data::Response.into())
}
+#[cfg_attr(
+ feature = "conduit_bin",
+ put("/_matrix/client/r0/user/<_>/rooms/<_>/account_data/<_>", data = "
")
+)]
+#[tracing::instrument(skip(db, body))]
+pub async fn set_room_account_data_route(
+ db: State<'_, Database>,
+ body: Ruma>,
+) -> ConduitResult {
+ let sender_user = body.sender_user.as_ref().expect("user is authenticated");
+
+ let data = serde_json::from_str(body.data.get())
+ .map_err(|_| Error::BadRequest(ErrorKind::BadJson, "Data is invalid."))?;
+
+ let event_type = body.event_type.to_string();
+
+ db.account_data.update(
+ Some(&body.room_id),
+ sender_user,
+ event_type.clone().into(),
+ &BasicEvent {
+ content: CustomEventContent { event_type, data },
+ },
+ &db.globals,
+ )?;
+
+ db.flush().await?;
+
+ Ok(set_room_account_data::Response.into())
+}
+
#[cfg_attr(
feature = "conduit_bin",
get("/_matrix/client/r0/user/<_>/account_data/<_>", data = "")
@@ -63,3 +94,24 @@ pub async fn get_global_account_data_route(
Ok(get_global_account_data::Response { account_data: data }.into())
}
+
+#[cfg_attr(
+ feature = "conduit_bin",
+ get("/_matrix/client/r0/user/<_>/rooms/<_>/account_data/<_>", data = "")
+)]
+#[tracing::instrument(skip(db, body))]
+pub async fn get_room_account_data_route(
+ db: State<'_, Database>,
+ body: Ruma>,
+) -> ConduitResult {
+ let sender_user = body.sender_user.as_ref().expect("user is authenticated");
+
+ let data = db
+ .account_data
+ .get::>(Some(&body.room_id), sender_user, body.event_type.clone().into())?
+ .ok_or(Error::BadRequest(ErrorKind::NotFound, "Data not found."))?;
+
+ db.flush().await?;
+
+ Ok(get_room_account_data::Response { account_data: data }.into())
+}
diff --git a/src/main.rs b/src/main.rs
index 327aefa..696ce5c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -77,7 +77,9 @@ fn setup_rocket() -> (rocket::Rocket, Config) {
client_server::get_filter_route,
client_server::create_filter_route,
client_server::set_global_account_data_route,
+ client_server::set_room_account_data_route,
client_server::get_global_account_data_route,
+ client_server::get_room_account_data_route,
client_server::set_displayname_route,
client_server::get_displayname_route,
client_server::set_avatar_url_route,