Skip to main content

tuwunel_api/server/
publicrooms.rs

1use 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/// # `POST /_matrix/federation/v1/publicRooms`
11///
12/// Lists the public rooms on this server.
13#[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/// # `GET /_matrix/federation/v1/publicRooms`
47///
48/// Lists the public rooms on this server.
49#[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}