mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
refactor: Fix errors in api/client/directory.rs
This commit is contained in:
+30
-33
@@ -3,21 +3,16 @@ use std::iter::once;
|
|||||||
use axum::extract::State;
|
use axum::extract::State;
|
||||||
use axum_client_ip::ClientIp;
|
use axum_client_ip::ClientIp;
|
||||||
use conduwuit::{
|
use conduwuit::{
|
||||||
Err, Event, Result, RoomVersion, err, info,
|
Err, Result, err, info,
|
||||||
utils::{
|
utils::{
|
||||||
TryFutureExtExt,
|
|
||||||
math::Expected,
|
math::Expected,
|
||||||
result::FlatOk,
|
|
||||||
stream::{ReadyExt, WidebandExt},
|
stream::{ReadyExt, WidebandExt},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use conduwuit_service::Services;
|
use conduwuit_service::Services;
|
||||||
use futures::{
|
use futures::StreamExt;
|
||||||
FutureExt, StreamExt, TryFutureExt,
|
|
||||||
future::{join, join4, join5},
|
|
||||||
};
|
|
||||||
use ruma::{
|
use ruma::{
|
||||||
OwnedRoomId, RoomId, ServerName, UInt, UserId,
|
ServerName, UInt,
|
||||||
api::{
|
api::{
|
||||||
client::{
|
client::{
|
||||||
directory::{
|
directory::{
|
||||||
@@ -28,6 +23,7 @@ use ruma::{
|
|||||||
},
|
},
|
||||||
federation,
|
federation,
|
||||||
},
|
},
|
||||||
|
assign,
|
||||||
directory::{Filter, PublicRoomsChunk, RoomNetwork, RoomTypeFilter},
|
directory::{Filter, PublicRoomsChunk, RoomNetwork, RoomTypeFilter},
|
||||||
events::{
|
events::{
|
||||||
StateEventType,
|
StateEventType,
|
||||||
@@ -110,12 +106,11 @@ pub(crate) async fn get_public_rooms_route(
|
|||||||
err!(Request(Unknown(warn!(?body.server, "Failed to return /publicRooms: {e}"))))
|
err!(Request(Unknown(warn!(?body.server, "Failed to return /publicRooms: {e}"))))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok(get_public_rooms::v3::Response {
|
Ok(assign!(get_public_rooms::v3::Response::new(response.chunk), {
|
||||||
chunk: response.chunk,
|
|
||||||
prev_batch: response.prev_batch,
|
prev_batch: response.prev_batch,
|
||||||
next_batch: response.next_batch,
|
next_batch: response.next_batch,
|
||||||
total_room_count_estimate: response.total_room_count_estimate,
|
total_room_count_estimate: response.total_room_count_estimate,
|
||||||
})
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// # `PUT /_matrix/client/r0/directory/list/room/{roomId}`
|
/// # `PUT /_matrix/client/r0/directory/list/room/{roomId}`
|
||||||
@@ -147,13 +142,7 @@ pub(crate) async fn set_room_visibility_route(
|
|||||||
return Err!(Request(Forbidden("Guests cannot publish to room directories")));
|
return Err!(Request(Forbidden("Guests cannot publish to room directories")));
|
||||||
}
|
}
|
||||||
|
|
||||||
let room_power_levels = services
|
if !user_can_publish_room(&services, sender_user, &body.room_id).await? {
|
||||||
.rooms
|
|
||||||
.state_accessor
|
|
||||||
.get_room_power_levels(&body.room_id)
|
|
||||||
.await;
|
|
||||||
|
|
||||||
if !room_power_levels.user_can_send_state(user_id, StateEventType::RoomHistoryVisibility) {
|
|
||||||
return Err!(Request(Forbidden("User is not allowed to publish this room")));
|
return Err!(Request(Forbidden("User is not allowed to publish this room")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,7 +193,7 @@ pub(crate) async fn set_room_visibility_route(
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(set_room_visibility::v3::Response {})
|
Ok(set_room_visibility::v3::Response::new())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// # `GET /_matrix/client/r0/directory/list/room/{roomId}`
|
/// # `GET /_matrix/client/r0/directory/list/room/{roomId}`
|
||||||
@@ -219,13 +208,13 @@ pub(crate) async fn get_room_visibility_route(
|
|||||||
return Err!(Request(NotFound("Room not found")));
|
return Err!(Request(NotFound("Room not found")));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(get_room_visibility::v3::Response {
|
let visibility = if services.rooms.directory.is_public_room(&body.room_id).await {
|
||||||
visibility: if services.rooms.directory.is_public_room(&body.room_id).await {
|
|
||||||
room::Visibility::Public
|
room::Visibility::Public
|
||||||
} else {
|
} else {
|
||||||
room::Visibility::Private
|
room::Visibility::Private
|
||||||
},
|
};
|
||||||
})
|
|
||||||
|
Ok(get_room_visibility::v3::Response::new(visibility))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn get_public_rooms_filtered_helper(
|
pub(crate) async fn get_public_rooms_filtered_helper(
|
||||||
@@ -243,24 +232,24 @@ pub(crate) async fn get_public_rooms_filtered_helper(
|
|||||||
.sending
|
.sending
|
||||||
.send_federation_request(
|
.send_federation_request(
|
||||||
other_server,
|
other_server,
|
||||||
federation::directory::get_public_rooms_filtered::v1::Request {
|
assign!(federation::directory::get_public_rooms_filtered::v1::Request::new(), {
|
||||||
limit,
|
limit,
|
||||||
since: since.map(ToOwned::to_owned),
|
since: since.map(ToOwned::to_owned),
|
||||||
filter: Filter {
|
filter: assign!(Filter::new(), {
|
||||||
generic_search_term: filter.generic_search_term.clone(),
|
generic_search_term: filter.generic_search_term.clone(),
|
||||||
room_types: filter.room_types.clone(),
|
room_types: filter.room_types.clone(),
|
||||||
},
|
}),
|
||||||
room_network: RoomNetwork::Matrix,
|
room_network: RoomNetwork::Matrix,
|
||||||
},
|
}),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
return Ok(get_public_rooms_filtered::v3::Response {
|
return Ok(assign!(get_public_rooms_filtered::v3::Response::new(), {
|
||||||
chunk: response.chunk,
|
chunk: response.chunk,
|
||||||
prev_batch: response.prev_batch,
|
prev_batch: response.prev_batch,
|
||||||
next_batch: response.next_batch,
|
next_batch: response.next_batch,
|
||||||
total_room_count_estimate: response.total_room_count_estimate,
|
total_room_count_estimate: response.total_room_count_estimate,
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use limit or else 10, with maximum 100
|
// Use limit or else 10, with maximum 100
|
||||||
@@ -291,16 +280,24 @@ pub(crate) async fn get_public_rooms_filtered_helper(
|
|||||||
.rooms
|
.rooms
|
||||||
.directory
|
.directory
|
||||||
.public_rooms()
|
.public_rooms()
|
||||||
.map(ToOwned::to_owned)
|
.wide_then(async |room_id| {
|
||||||
.wide_then(|room_id| public_rooms_chunk(services, room_id))
|
let summary = services
|
||||||
.ready_filter_map(|chunk| {
|
.rooms
|
||||||
|
.summary
|
||||||
|
.build_local_room_summary(&room_id)
|
||||||
|
.await
|
||||||
|
.expect("room in public room directory should exist");
|
||||||
|
|
||||||
|
summary.into()
|
||||||
|
})
|
||||||
|
.ready_filter_map(|chunk: PublicRoomsChunk| {
|
||||||
if !filter.room_types.is_empty() && !filter.room_types.contains(&RoomTypeFilter::from(chunk.room_type.clone())) {
|
if !filter.room_types.is_empty() && !filter.room_types.contains(&RoomTypeFilter::from(chunk.room_type.clone())) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(query) = filter.generic_search_term.as_ref().map(|q| q.to_lowercase()) {
|
if let Some(query) = filter.generic_search_term.as_ref().map(|q| q.to_lowercase()) {
|
||||||
if let Some(name) = &chunk.name {
|
if let Some(name) = &chunk.name {
|
||||||
if name.as_str().to_lowercase().contains(&query) {
|
if name.to_lowercase().contains(&query) {
|
||||||
return Some(chunk);
|
return Some(chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -342,7 +342,7 @@ impl Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Prepare a summary of a room known to this server.
|
/// Prepare a summary of a room known to this server.
|
||||||
async fn build_local_room_summary(&self, room_id: &RoomId) -> Option<RoomSummary> {
|
pub async fn build_local_room_summary(&self, room_id: &RoomId) -> Option<RoomSummary> {
|
||||||
// If we can't find a version for this room, it doesn't exist.
|
// If we can't find a version for this room, it doesn't exist.
|
||||||
let room_version = self.services.state.get_room_version(room_id).await.ok()?;
|
let room_version = self.services.state.get_room_version(room_id).await.ok()?;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user