Skip to main content

tuwunel_api/client/account_data/
get_room_account_data.rs

1use axum::extract::State;
2use ruma::{
3	api::client::config::get_room_account_data, events::AnyRoomAccountDataEventContent,
4	serde::Raw,
5};
6use serde::Deserialize;
7use tuwunel_core::{Err, Result, err};
8
9use super::{assert_account_data_owner, is_empty_content};
10use crate::Ruma;
11
12#[derive(Deserialize)]
13struct ExtractRoomEventContent {
14	content: Raw<AnyRoomAccountDataEventContent>,
15}
16
17/// # `GET /_matrix/client/r0/user/{userId}/rooms/{roomId}/account_data/{type}`
18///
19/// Gets some room account data for the sender user.
20pub(crate) async fn get_room_account_data_route(
21	State(services): State<crate::State>,
22	body: Ruma<get_room_account_data::v3::Request>,
23) -> Result<get_room_account_data::v3::Response> {
24	let sender_user = body.sender_user();
25
26	assert_account_data_owner(
27		sender_user,
28		&body.user_id,
29		body.appservice_info.as_ref(),
30		"You cannot get account data of other users.",
31	)?;
32
33	let account_data: ExtractRoomEventContent = services
34		.account_data
35		.get_room(&body.room_id, &body.user_id, body.event_type.clone())
36		.await
37		.map_err(|_| err!(Request(NotFound("Data not found."))))?;
38
39	if is_empty_content(&account_data.content) {
40		return Err!(Request(NotFound("Data not found.")));
41	}
42
43	Ok(get_room_account_data::v3::Response { account_data: account_data.content })
44}