diff --git a/src/api/client/admin/site/rooms/ban.rs b/src/api/client/admin/site/rooms/ban.rs index 81ec65d6a..c609b98ee 100644 --- a/src/api/client/admin/site/rooms/ban.rs +++ b/src/api/client/admin/site/rooms/ban.rs @@ -1,10 +1,10 @@ use axum::extract::State; -use conduwuit::{info, utils::ReadyExt, warn, Err, Result}; +use conduwuit::{Err, Result, info, utils::ReadyExt, warn}; use futures::{FutureExt, StreamExt}; -use ruma::{events::room::message::RoomMessageEventContent, OwnedRoomAliasId}; +use ruma::{OwnedRoomAliasId, events::room::message::RoomMessageEventContent}; use ruminuwuity::admin::continuwuity::rooms; -use crate::{client::leave_room, Ruma}; +use crate::{Ruma, client::leave_room}; /// # `PUT /_continuwuity/admin/v1/rooms/{roomID}/ban` /// diff --git a/src/api/client/admin/site/users/list.rs b/src/api/client/admin/site/users/list.rs index 7541f97bd..6094ba16a 100644 --- a/src/api/client/admin/site/users/list.rs +++ b/src/api/client/admin/site/users/list.rs @@ -1,5 +1,5 @@ use axum::extract::State; -use conduwuit::Err; +use conduwuit::{Err, utils::stream::WidebandExt}; use futures::StreamExt; use ruminuwuity::admin::continuwuity::users; use tokio::join; @@ -19,24 +19,30 @@ pub(crate) async fn list_users_route( return Err!(Request(Forbidden("Only server administrators can use this endpoint"))); } - let mut users = Vec::new(); - while let Some(user_id) = services.users.list_local_users().next().await { - let (deactivated, suspended, locked, admin, login_disabled) = join!( - services.users.is_deactivated(&user_id), - services.users.is_suspended(&user_id), - services.users.is_locked(&user_id), - services.users.is_admin(&user_id), - services.users.is_login_disabled(&user_id), - ); - users.push(users::list::v1::User { - user_id: user_id.clone(), - deactivated: deactivated.unwrap_or_default(), - suspended: suspended.unwrap_or_default(), - locked: locked.unwrap_or_default(), - admin, - login_disabled, - }); - } + let users = services + .users + .list_local_users() + .skip(body.offset.unwrap_or_default()) + .take(body.limit.unwrap_or(100).min(100)) + .wide_filter_map(|user_id| async move { + let (deactivated, suspended, locked, admin, login_disabled) = join!( + services.users.is_deactivated(&user_id), + services.users.is_suspended(&user_id), + services.users.is_locked(&user_id), + services.users.is_admin(&user_id), + services.users.is_login_disabled(&user_id), + ); + Some(users::list::v1::User { + user_id: user_id.clone(), + deactivated: deactivated.unwrap_or_default(), + suspended: suspended.unwrap_or_default(), + locked: locked.unwrap_or_default(), + admin, + login_disabled, + }) + }) + .collect() + .await; Ok(users::list::v1::Response::new(users)) } diff --git a/src/api/router.rs b/src/api/router.rs index 0a0c51af5..0b295e06e 100644 --- a/src/api/router.rs +++ b/src/api/router.rs @@ -284,7 +284,7 @@ pub fn build(router: Router, state: State) -> Router { router = router .ruma_route(&admin_api::users::list_users_route) .ruma_route(&admin_api::rooms::ban_room) - .ruma_route(&admin_api::rooms::list_rooms) + .ruma_route(&admin_api::rooms::list_rooms); }; router diff --git a/src/ruminuwuity/admin/continuwuity/users/list.rs b/src/ruminuwuity/admin/continuwuity/users/list.rs index 8348c603c..b573aff25 100644 --- a/src/ruminuwuity/admin/continuwuity/users/list.rs +++ b/src/ruminuwuity/admin/continuwuity/users/list.rs @@ -7,7 +7,7 @@ pub mod v1 { use serde::Deserialize; metadata! { - method: PUT, + method: GET, rate_limited: false, authentication: AccessToken, history: { @@ -30,6 +30,18 @@ pub mod v1 { #[ruma_api(query)] #[serde(default, skip_serializing_if = "ruma::serde::is_default")] pub include_suspended: bool, + + /// The maximum number of results to return in this page. Maximum (and + /// default) is 100. + #[ruma_api(query)] + #[serde(default, skip_serializing_if = "ruma::serde::is_default")] + pub limit: Option, + + /// The number of results to skip over before returning results. Default + /// is 0. + #[ruma_api(query)] + #[serde(default, skip_serializing_if = "ruma::serde::is_default")] + pub offset: Option, } #[derive(Debug, Clone, PartialEq, Eq, Deserialize, serde::Serialize)]