tuwunel_api/server/
state_ids.rs1use std::{borrow::Borrow, iter::once};
2
3use axum::extract::State;
4use futures::{FutureExt, StreamExt, TryFutureExt, TryStreamExt, future::try_join};
5use ruma::{OwnedEventId, api::federation::event::get_room_state_ids};
6use tuwunel_core::{Result, at, err};
7
8use super::{AccessCheck, utils::require_event_in_room};
9use crate::Ruma;
10
11pub(crate) async fn get_room_state_ids_route(
16 State(services): State<crate::State>,
17 body: Ruma<get_room_state_ids::v1::Request>,
18) -> Result<get_room_state_ids::v1::Response> {
19 let access_check = AccessCheck {
20 services: &services,
21 origin: body.origin(),
22 room_id: &body.room_id,
23 event_id: None,
24 };
25
26 access_check.check().await?;
27
28 require_event_in_room(&services, &body.event_id, &body.room_id).await?;
29
30 let shortstatehash = services
31 .state
32 .pdu_shortstatehash(&body.event_id)
33 .map_err(|_| err!(Request(NotFound("Pdu state not found."))));
34
35 let room_version = services.state.get_room_version(&body.room_id);
36
37 let (shortstatehash, room_version) = try_join(shortstatehash, room_version).await?;
38
39 let auth_chain_ids = services
40 .auth_chain
41 .event_ids_iter(&body.room_id, &room_version, once(body.event_id.borrow()))
42 .try_collect();
43
44 let pdu_ids = services
45 .state_accessor
46 .state_full_ids(shortstatehash)
47 .map(at!(1))
48 .collect::<Vec<OwnedEventId>>()
49 .map(Ok);
50
51 let (auth_chain_ids, pdu_ids) = try_join(auth_chain_ids, pdu_ids).await?;
52
53 Ok(get_room_state_ids::v1::Response { auth_chain_ids, pdu_ids })
54}