tuwunel_api/client/account_data/
get_room_account_data.rs1use 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::is_empty_content;
10use crate::Ruma;
11
12#[derive(Deserialize)]
13struct ExtractRoomEventContent {
14 content: Raw<AnyRoomAccountDataEventContent>,
15}
16
17pub(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 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: ExtractRoomEventContent = services
31 .account_data
32 .get_room(&body.room_id, &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_room_account_data::v3::Response { account_data: account_data.content })
41}