X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapi_crud%2Fsrc%2Fcommunity%2Flist.rs;h=1f620dd9c98887c2303758a62366d5d4e6012bf0;hb=c8063f3267cf2b3622f1fdc69128c6b55feefbbc;hp=7afb61783061078af6c639ffe2c7a47142afb3c4;hpb=a2a594b7635db2241602be56250f7d9bf992f7b9;p=lemmy.git diff --git a/crates/api_crud/src/community/list.rs b/crates/api_crud/src/community/list.rs index 7afb6178..1f620dd9 100644 --- a/crates/api_crud/src/community/list.rs +++ b/crates/api_crud/src/community/list.rs @@ -1,66 +1,46 @@ -use crate::PerformCrud; -use actix_web::web::Data; +use actix_web::web::{Data, Json, Query}; use lemmy_api_common::{ community::{ListCommunities, ListCommunitiesResponse}, - utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt}, + context::LemmyContext, + utils::{check_private_instance, is_admin, local_user_view_from_jwt_opt}, }; -use lemmy_db_schema::traits::DeleteableOrRemoveable; -use lemmy_db_views_actor::community_view::CommunityQueryBuilder; -use lemmy_utils::{error::LemmyError, ConnectionId}; -use lemmy_websocket::LemmyContext; - -#[async_trait::async_trait(?Send)] -impl PerformCrud for ListCommunities { - type Response = ListCommunitiesResponse; - - #[tracing::instrument(skip(context, _websocket_id))] - async fn perform( - &self, - context: &Data, - _websocket_id: Option, - ) -> Result { - let data: &ListCommunities = self; - let local_user_view = - get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) - .await?; - - check_private_instance(&local_user_view, context.pool()).await?; - - let person_id = local_user_view.to_owned().map(|l| l.person.id); - - // Don't show NSFW by default - let show_nsfw = match &local_user_view { - Some(uv) => uv.local_user.show_nsfw, - None => false, - }; - - let sort = data.sort; - let listing_type = data.type_; - let page = data.page; - let limit = data.limit; - let mut communities = blocking(context.pool(), move |conn| { - CommunityQueryBuilder::create(conn) - .listing_type(listing_type) - .sort(sort) - .show_nsfw(show_nsfw) - .my_person_id(person_id) - .page(page) - .limit(limit) - .list() - }) - .await??; - - // Blank out deleted or removed info for non-logged in users - if person_id.is_none() { - for cv in communities - .iter_mut() - .filter(|cv| cv.community.deleted || cv.community.removed) - { - cv.community = cv.to_owned().community.blank_out_deleted_or_removed_info(); - } - } - - // Return the jwt - Ok(ListCommunitiesResponse { communities }) +use lemmy_db_schema::source::local_site::LocalSite; +use lemmy_db_views_actor::community_view::CommunityQuery; +use lemmy_utils::error::LemmyError; + +#[tracing::instrument(skip(context))] +pub async fn list_communities( + data: Query, + context: Data, +) -> Result, LemmyError> { + let local_user_view = local_user_view_from_jwt_opt(data.auth.as_ref(), &context).await; + let local_site = LocalSite::read(&mut context.pool()).await?; + let is_admin = local_user_view + .as_ref() + .map(|luv| is_admin(luv).is_ok()) + .unwrap_or_default(); + + check_private_instance(&local_user_view, &local_site)?; + + let sort = data.sort; + let listing_type = data.type_; + let show_nsfw = data.show_nsfw.unwrap_or_default(); + let page = data.page; + let limit = data.limit; + let local_user = local_user_view.map(|l| l.local_user); + let communities = CommunityQuery { + listing_type, + show_nsfw, + sort, + local_user: local_user.as_ref(), + page, + limit, + is_mod_or_admin: is_admin, + ..Default::default() } + .list(&mut context.pool()) + .await?; + + // Return the jwt + Ok(Json(ListCommunitiesResponse { communities })) }