X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapi_crud%2Fsrc%2Fcommunity%2Flist.rs;h=c8ce9e58c9a810992c56870f6496167da7eaec44;hb=37998b3398ed925a7640a9b67d1dc6ef871893a9;hp=dcf5886aea1f0ca2c509513aa166b1f6f3a94ea3;hpb=235cc8b22897bfb3e71ba3dbd725d36863fea8ba;p=lemmy.git diff --git a/crates/api_crud/src/community/list.rs b/crates/api_crud/src/community/list.rs index dcf5886a..c8ce9e58 100644 --- a/crates/api_crud/src/community/list.rs +++ b/crates/api_crud/src/community/list.rs @@ -1,63 +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::{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::{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_websocket::LemmyContext; +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 = blocking(context.pool(), LocalSite::read).await??; + check_private_instance(&local_user_view, &local_site)?; - check_private_instance(&local_user_view, &local_site)?; - - let person_id = local_user_view.to_owned().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 = blocking(context.pool(), move |conn| { - CommunityQuery::builder() - .conn(conn) - .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.to_owned().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 })) }