use futures::future::join_all; use revolt_database::util::permissions::DatabasePermissionQuery; use revolt_database::util::reference::Reference; use revolt_database::{Database, User}; use revolt_models::v0; use revolt_permissions::{calculate_server_permissions, ChannelPermission}; use revolt_result::Result; use rocket::serde::json::Json; use rocket::State; /// # Fetch Bans /// /// Fetch all bans on a server. #[openapi(tag = "Server Members")] #[get("//bans")] pub async fn list( db: &State, user: User, target: Reference, ) -> Result> { let server = target.as_server(db).await?; let mut query = DatabasePermissionQuery::new(db, &user).server(&server); calculate_server_permissions(&mut query) .await .throw_if_lacking_channel_permission(ChannelPermission::BanMembers)?; let bans = db.fetch_bans(&server.id).await?; let users = join_all( db.fetch_users( &bans .iter() .map(|x| &x.id.user) .cloned() .collect::>(), ) .await? .into_iter() .map(|u| u.into_self()), ) .await; Ok(Json(v0::BanListResult { users: users.into_iter().map(Into::into).collect(), bans: bans.into_iter().map(Into::into).collect(), })) }