Skip to main content

tuwunel_api/client/account_data/
get_global_account_data.rs

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