X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapi_crud%2Fsrc%2Fcommunity%2Flist.rs;h=c8ce9e58c9a810992c56870f6496167da7eaec44;hb=37998b3398ed925a7640a9b67d1dc6ef871893a9;hp=f77ebce75537bb7da4b24fce3e72525d6940f309;hpb=030afbc2e78a91b1a302ca59c4ea0ccef9057019;p=lemmy.git diff --git a/crates/api_crud/src/community/list.rs b/crates/api_crud/src/community/list.rs index f77ebce7..c8ce9e58 100644 --- a/crates/api_crud/src/community/list.rs +++ b/crates/api_crud/src/community/list.rs @@ -1,61 +1,43 @@ -use crate::PerformCrud; -use actix_web::web::Data; +use actix_web::web::{Data, Json, Query}; use lemmy_api_common::{ community::{ListCommunities, ListCommunitiesResponse}, - utils::{check_private_instance, get_local_user_view_from_jwt_opt}, - LemmyContext, + context::LemmyContext, + utils::{check_private_instance, is_admin, local_user_view_from_jwt_opt}, }; -use lemmy_db_schema::{source::local_site::LocalSite, traits::DeleteableOrRemoveable}; +use lemmy_db_schema::source::local_site::LocalSite; use lemmy_db_views_actor::community_view::CommunityQuery; -use lemmy_utils::{error::LemmyError, ConnectionId}; +use lemmy_utils::error::LemmyError; -#[async_trait::async_trait(?Send)] -impl PerformCrud for ListCommunities { - type Response = ListCommunitiesResponse; +#[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()); - #[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?; - let local_site = LocalSite::read(context.pool()).await?; + check_private_instance(&local_user_view, &local_site)?; - check_private_instance(&local_user_view, &local_site)?; - - let person_id = local_user_view.clone().map(|l| l.person.id); - - let sort = data.sort; - let listing_type = data.type_; - let page = data.page; - let limit = data.limit; - let local_user = local_user_view.map(|l| l.local_user); - let mut communities = CommunityQuery::builder() - .pool(context.pool()) - .listing_type(listing_type) - .sort(sort) - .local_user(local_user.as_ref()) - .page(page) - .limit(limit) - .build() - .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.clone().community.blank_out_deleted_or_removed_info(); - } - } - - // Return the jwt - Ok(ListCommunitiesResponse { communities }) + let sort = data.sort; + let listing_type = data.type_; + let show_nsfw = data.show_nsfw; + 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 })) }