feat: room_account_data endpoints

next
Timo Kösters 2021-03-24 08:48:28 +01:00
parent 1d00a8c41f
commit e305889b72
No known key found for this signature in database
GPG Key ID: 356E705610F626D5
2 changed files with 55 additions and 1 deletions

View File

@ -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 = "<body>")
)]
#[tracing::instrument(skip(db, body))]
pub async fn set_room_account_data_route(
db: State<'_, Database>,
body: Ruma<set_room_account_data::Request<'_>>,
) -> ConduitResult<set_room_account_data::Response> {
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 = "<body>")
@ -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 = "<body>")
)]
#[tracing::instrument(skip(db, body))]
pub async fn get_room_account_data_route(
db: State<'_, Database>,
body: Ruma<get_room_account_data::Request<'_>>,
) -> ConduitResult<get_room_account_data::Response> {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
let data = db
.account_data
.get::<Raw<ruma::events::AnyBasicEvent>>(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())
}

View File

@ -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,