tuwunel_api/server/
publicrooms.rs1use axum::extract::State;
2use ruma::{
3 api::federation::directory::{get_public_rooms, get_public_rooms_filtered},
4 directory::Filter,
5};
6use tuwunel_core::{Err, Result, err};
7
8use crate::{ClientIp, Ruma};
9
10#[tracing::instrument(name = "publicrooms", level = "debug", skip_all, fields(%client))]
14pub(crate) async fn get_public_rooms_filtered_route(
15 State(services): State<crate::State>,
16 ClientIp(client): ClientIp,
17 body: Ruma<get_public_rooms_filtered::v1::Request>,
18) -> Result<get_public_rooms_filtered::v1::Response> {
19 if !services
20 .server
21 .config
22 .allow_public_room_directory_over_federation
23 {
24 return Err!(Request(Forbidden("Room directory is not public")));
25 }
26
27 let response = crate::client::get_public_rooms_filtered_helper(
28 &services,
29 None,
30 body.limit,
31 body.since.as_deref(),
32 &body.filter,
33 &body.room_network,
34 )
35 .await
36 .map_err(|_| err!(Request(Unknown("Failed to return this server's public room list."))))?;
37
38 Ok(get_public_rooms_filtered::v1::Response {
39 chunk: response.chunk,
40 prev_batch: response.prev_batch,
41 next_batch: response.next_batch,
42 total_room_count_estimate: response.total_room_count_estimate,
43 })
44}
45
46#[tracing::instrument(name = "publicrooms", level = "debug", skip_all, fields(%client))]
50pub(crate) async fn get_public_rooms_route(
51 State(services): State<crate::State>,
52 ClientIp(client): ClientIp,
53 body: Ruma<get_public_rooms::v1::Request>,
54) -> Result<get_public_rooms::v1::Response> {
55 if !services
56 .config
57 .allow_public_room_directory_over_federation
58 {
59 return Err!(Request(Forbidden("Room directory is not public")));
60 }
61
62 let response = crate::client::get_public_rooms_filtered_helper(
63 &services,
64 None,
65 body.limit,
66 body.since.as_deref(),
67 &Filter::default(),
68 &body.room_network,
69 )
70 .await
71 .map_err(|_| err!(Request(Unknown("Failed to return this server's public room list."))))?;
72
73 Ok(get_public_rooms::v1::Response {
74 chunk: response.chunk,
75 prev_batch: response.prev_batch,
76 next_batch: response.next_batch,
77 total_room_count_estimate: response.total_room_count_estimate,
78 })
79}