diff --git a/crates/apub/src/api/list_posts.rs b/crates/apub/src/api/list_posts.rs index 99c790c733..c3a37ef7ed 100644 --- a/crates/apub/src/api/list_posts.rs +++ b/crates/apub/src/api/list_posts.rs @@ -7,7 +7,7 @@ use activitypub_federation::config::Data; use lemmy_api_common::{ context::LemmyContext, post::{GetPosts, GetPostsResponse}, - utils::{check_private_instance, is_mod_or_admin_opt, local_user_view_from_jwt_opt}, + utils::{check_private_instance, local_user_view_from_jwt_opt}, }; use lemmy_db_schema::source::{community::Community, local_site::LocalSite}; use lemmy_db_views::post_view::PostQuery; @@ -41,11 +41,6 @@ impl PerformApub for GetPosts { let listing_type = listing_type_with_default(data.type_, &local_site, community_id)?; - let is_mod_or_admin = - is_mod_or_admin_opt(context.pool(), local_user_view.as_ref(), community_id) - .await - .is_ok(); - let posts = PostQuery::builder() .pool(context.pool()) .local_user(local_user_view.map(|l| l.local_user).as_ref()) @@ -55,7 +50,6 @@ impl PerformApub for GetPosts { .saved_only(saved_only) .page(page) .limit(limit) - .is_mod_or_admin(Some(is_mod_or_admin)) .build() .list() .await diff --git a/crates/apub/src/api/read_person.rs b/crates/apub/src/api/read_person.rs index 1e4797fa4f..25e46fac36 100644 --- a/crates/apub/src/api/read_person.rs +++ b/crates/apub/src/api/read_person.rs @@ -60,8 +60,9 @@ impl PerformApub for GetPersonDetails { let limit = data.limit; let saved_only = data.saved_only; let community_id = data.community_id; - let local_user = local_user_view.map(|l| l.local_user); + let local_user = local_user_view.as_ref().map(|l| l.local_user.clone()); let local_user_clone = local_user.clone(); + let is_own_profile = Some(Some(person_details_id) == local_user_view.map(|l| l.person.id)); let posts_query = PostQuery::builder() .pool(context.pool()) @@ -69,7 +70,8 @@ impl PerformApub for GetPersonDetails { .saved_only(saved_only) .local_user(local_user.as_ref()) .community_id(community_id) - .is_mod_or_admin(is_admin) + .show_removed(is_admin) + .show_deleted(is_own_profile) .page(page) .limit(limit); @@ -90,7 +92,8 @@ impl PerformApub for GetPersonDetails { .local_user(local_user_clone.as_ref()) .sort(sort.map(post_to_comment_sort_type)) .saved_only(saved_only) - .show_deleted_and_removed(Some(false)) + .show_removed(is_admin) + .show_deleted(is_own_profile) .community_id(community_id) .page(page) .limit(limit); diff --git a/crates/apub/src/api/search.rs b/crates/apub/src/api/search.rs index 025d1408af..763adc0cfd 100644 --- a/crates/apub/src/api/search.rs +++ b/crates/apub/src/api/search.rs @@ -66,7 +66,6 @@ impl PerformApub for Search { .creator_id(creator_id) .local_user(local_user.as_ref()) .search_term(Some(q)) - .is_mod_or_admin(is_admin) .page(page) .limit(limit) .build() @@ -127,7 +126,6 @@ impl PerformApub for Search { .creator_id(creator_id) .local_user(local_user_.as_ref()) .search_term(Some(q)) - .is_mod_or_admin(is_admin) .page(page) .limit(limit) .build() @@ -194,7 +192,6 @@ impl PerformApub for Search { .community_id(community_id) .creator_id(creator_id) .url_search(Some(q)) - .is_mod_or_admin(is_admin) .page(page) .limit(limit) .build() diff --git a/crates/db_views/src/comment_view.rs b/crates/db_views/src/comment_view.rs index 7c33158d6e..fc028cef53 100644 --- a/crates/db_views/src/comment_view.rs +++ b/crates/db_views/src/comment_view.rs @@ -170,7 +170,8 @@ pub struct CommentQuery<'a> { local_user: Option<&'a LocalUser>, search_term: Option, saved_only: Option, - show_deleted_and_removed: Option, + show_deleted: Option, + show_removed: Option, page: Option, limit: Option, max_depth: Option, @@ -298,8 +299,11 @@ impl<'a> CommentQuery<'a> { query = query.filter(comment_saved::comment_id.is_not_null()); } - if !self.show_deleted_and_removed.unwrap_or(true) { + if !self.show_deleted.unwrap_or(false) { query = query.filter(comment::deleted.eq(false)); + } + + if !self.show_removed.unwrap_or(false) { query = query.filter(comment::removed.eq(false)); } diff --git a/crates/db_views/src/post_view.rs b/crates/db_views/src/post_view.rs index 14cf7fe197..479024efb3 100644 --- a/crates/db_views/src/post_view.rs +++ b/crates/db_views/src/post_view.rs @@ -206,8 +206,8 @@ pub struct PostQuery<'a> { search_term: Option, url_search: Option, saved_only: Option, - /// Used to show deleted or removed posts for admins - is_mod_or_admin: Option, + show_removed: Option, + show_deleted: Option, page: Option, limit: Option, } @@ -305,16 +305,18 @@ impl<'a> PostQuery<'a> { )) .into_boxed(); - // Hide deleted and removed for non-admins or mods - // TODO This eventually needs to show posts where you are the creator - if !self.is_mod_or_admin.unwrap_or(false) { + if !self.show_deleted.unwrap_or(false) { query = query - .filter(community::removed.eq(false)) .filter(community::deleted.eq(false)) - .filter(post::removed.eq(false)) .filter(post::deleted.eq(false)); } + if !self.show_removed.unwrap_or(false) { + query = query + .filter(community::removed.eq(false)) + .filter(post::removed.eq(false)); + } + if self.community_id.is_none() { query = query.then_order_by(post_aggregates::featured_local.desc()); } else if let Some(community_id) = self.community_id { @@ -874,6 +876,94 @@ mod tests { cleanup(data, pool).await; } + #[tokio::test] + #[serial] + async fn post_listings_removed() { + let pool = &build_db_pool_for_tests().await; + let data = init_data(pool).await; + + // Remove the post + Post::update( + pool, + data.inserted_post.id, + &PostUpdateForm::builder().removed(Some(true)).build(), + ) + .await + .unwrap(); + + // Make sure you don't see the removed post in the results + let post_listings_no_admin = PostQuery::builder() + .pool(pool) + .sort(Some(SortType::New)) + .local_user(Some(&data.inserted_local_user)) + .show_removed(Some(false)) + .build() + .list() + .await + .unwrap(); + + assert_eq!(1, post_listings_no_admin.len()); + + // Make sure they see both + let post_listings_is_admin = PostQuery::builder() + .pool(pool) + .sort(Some(SortType::New)) + .local_user(Some(&data.inserted_local_user)) + .include_removed(Some(true)) + .build() + .list() + .await + .unwrap(); + + assert_eq!(2, post_listings_is_admin.len()); + + cleanup(data, pool).await; + } + + #[tokio::test] + #[serial] + async fn post_listings_deleted() { + let pool = &build_db_pool_for_tests().await; + let data = init_data(pool).await; + + // Delete the post + Post::update( + pool, + data.inserted_post.id, + &PostUpdateForm::builder().deleted(Some(true)).build(), + ) + .await + .unwrap(); + + // Make sure you don't see the deleted post in the results + let post_listings_no_admin = PostQuery::builder() + .pool(pool) + .sort(Some(SortType::New)) + .local_user(Some(&data.inserted_local_user)) + .show_deleted(Some(false)) + .build() + .list() + .await + .unwrap(); + + assert_eq!(1, post_listings_no_admin.len()); + + // Make sure they see both + let post_listings_is_admin = PostQuery::builder() + .pool(pool) + .sort(Some(SortType::New)) + .local_user(Some(&data.inserted_local_user)) + .include_removed(Some(true)) + .build() + .list() + .await + .unwrap(); + + assert_eq!(2, post_listings_is_admin.len()); + + cleanup(data, pool).await; + } + #[tokio::test] #[serial] async fn post_listings_deleted() {