Skip to content

Commit

Permalink
Show deleted and removed posts for profile views. Fixes #2624 (#2729)
Browse files Browse the repository at this point in the history
* Show deleted and removed posts for profile views. Fixes #2624

* Only showing non-deleted/removed posts for creator.

* Add a admin or mod check to views, to show deleted and removed posts.

- Also removed the pointless "blanking" functions

* Fix clippy

* Make hidden posts comment clearer.

* Fixing federation tests.

* Fixing fmt.
  • Loading branch information
dessalines committed Mar 1, 2023
1 parent d9e7f01 commit 48f1871
Show file tree
Hide file tree
Showing 30 changed files with 215 additions and 243 deletions.
2 changes: 0 additions & 2 deletions api_tests/src/comment.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,6 @@ test("Delete a comment", async () => {
commentRes.comment_view.comment.id
);
expect(deleteCommentRes.comment_view.comment.deleted).toBe(true);
expect(deleteCommentRes.comment_view.comment.content).toBe("");

// Make sure that comment is undefined on beta
let betaCommentRes = (await resolveComment(
Expand Down Expand Up @@ -159,7 +158,6 @@ test("Remove a comment from admin and community on the same instance", async ()
// The beta admin removes it (the community lives on beta)
let removeCommentRes = await removeComment(beta, true, betaCommentId);
expect(removeCommentRes.comment_view.comment.removed).toBe(true);
expect(removeCommentRes.comment_view.comment.content).toBe("");

// Make sure that comment is removed on alpha (it gets pushed since an admin from beta removed it)
let refetchedPostComments = await getComments(
Expand Down
4 changes: 2 additions & 2 deletions api_tests/src/post.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ test("Enforce site ban for federated user", async () => {

// existing alpha post should be removed on beta
let searchBeta2 = await searchPostLocal(beta, postRes1.post_view.post);
expect(searchBeta2.posts[0]).toBeUndefined();
expect(searchBeta2.posts[0].post.removed).toBe(true);

// Unban alpha
let unBanAlpha = await banPersonFromSite(
Expand Down Expand Up @@ -436,7 +436,7 @@ test("Enforce community ban for federated user", async () => {

// ensure that the post by alpha got removed
let searchAlpha1 = await searchPostLocal(alpha, postRes1.post_view.post);
expect(searchAlpha1.posts[0]).toBeUndefined();
expect(searchAlpha1.posts[0].post.removed).toBe(true);

// Alpha tries to make post on beta, but it fails because of ban
let postRes2 = await createPost(alpha, betaCommunity.community.id);
Expand Down
1 change: 0 additions & 1 deletion api_tests/src/private_message.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ test("Delete a private message", async () => {
pmRes.private_message_view.private_message.id
);
expect(deletedPmRes.private_message_view.private_message.deleted).toBe(true);
expect(deletedPmRes.private_message_view.private_message.content).toBe("");

// The GetPrivateMessages filters out deleted,
// even though they are in the actual database.
Expand Down
8 changes: 4 additions & 4 deletions api_tests/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2363,10 +2363,10 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==

lemmy-js-client@0.17.0-rc.61:
version "0.17.0-rc.61"
resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.17.0-rc.61.tgz#c01e129a3d4c3483ecf337f1e4acf0ad91f9684f"
integrity sha512-xauBCD5i4vlUEWqsTMIXLCXeIjAK7ivVIN3C/g+RMAM7mD3CTcRkDZUerwnvLipIfr7V/4iYLWZW0orBaiV1CQ==
lemmy-js-client@0.17.2-rc.1:
version "0.17.2-rc.1"
resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.17.2-rc.1.tgz#fe8d1508311bbf245acc98c2c3e47e2165a95b14"
integrity sha512-YrOXuCofgkqp28krmPTQZAfUWL5zEDA0sRJ0abKcgf/I8YYkYkUkPS9TOORN5Lv3bc8RAAz4+2/zLHqYL/Tnow==
dependencies:
node-fetch "2.6.6"

Expand Down
3 changes: 2 additions & 1 deletion crates/api/src/community/block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ impl Perform for BlockCommunity {
.map_err(|e| LemmyError::from_error_message(e, "community_block_already_exists"))?;
}

let community_view = CommunityView::read(context.pool(), community_id, Some(person_id)).await?;
let community_view =
CommunityView::read(context.pool(), community_id, Some(person_id), None).await?;

Ok(BlockCommunityResponse {
blocked: data.block,
Expand Down
3 changes: 2 additions & 1 deletion crates/api/src/community/follow.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ impl Perform for FollowCommunity {

let community_id = data.community_id;
let person_id = local_user_view.person.id;
let community_view = CommunityView::read(context.pool(), community_id, Some(person_id)).await?;
let community_view =
CommunityView::read(context.pool(), community_id, Some(person_id), None).await?;
let discussion_languages = CommunityLanguage::read(context.pool(), community_id).await?;

Ok(Self::Response {
Expand Down
2 changes: 1 addition & 1 deletion crates/api/src/community/transfer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ impl Perform for TransferCommunity {

let community_id = data.community_id;
let person_id = local_user_view.person.id;
let community_view = CommunityView::read(context.pool(), community_id, Some(person_id))
let community_view = CommunityView::read(context.pool(), community_id, Some(person_id), None)
.await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;

Expand Down
2 changes: 1 addition & 1 deletion crates/api/src/post/mark_read.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ impl Perform for MarkPostAsRead {
}

// Fetch it
let post_view = PostView::read(context.pool(), post_id, Some(person_id)).await?;
let post_view = PostView::read(context.pool(), post_id, Some(person_id), None).await?;

let res = Self::Response { post_view };

Expand Down
2 changes: 1 addition & 1 deletion crates/api/src/post/save.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ impl Perform for SavePost {

let post_id = data.post_id;
let person_id = local_user_view.person.id;
let post_view = PostView::read(context.pool(), post_id, Some(person_id)).await?;
let post_view = PostView::read(context.pool(), post_id, Some(person_id), None).await?;

// Mark the post as read
mark_post_as_read(person_id, post_id, context.pool()).await?;
Expand Down
2 changes: 1 addition & 1 deletion crates/api/src/post_report/create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ impl Perform for CreatePostReport {

let person_id = local_user_view.person.id;
let post_id = data.post_id;
let post_view = PostView::read(context.pool(), post_id, None).await?;
let post_view = PostView::read(context.pool(), post_id, None, None).await?;

check_community_ban(person_id, post_view.community.id, context.pool()).await?;

Expand Down
17 changes: 17 additions & 0 deletions crates/api_common/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,23 @@ pub async fn is_mod_or_admin(
Ok(())
}

#[tracing::instrument(skip_all)]
pub async fn is_mod_or_admin_opt(
pool: &DbPool,
local_user_view: Option<&LocalUserView>,
community_id: Option<CommunityId>,
) -> Result<(), LemmyError> {
if let Some(local_user_view) = local_user_view {
if let Some(community_id) = community_id {
is_mod_or_admin(pool, local_user_view.person.id, community_id).await
} else {
is_admin(local_user_view)
}
} else {
Err(LemmyError::from_message("not_a_mod_or_admin"))
}
}

pub async fn is_top_admin(pool: &DbPool, person_id: PersonId) -> Result<(), LemmyError> {
let admins = PersonViewSafe::admins(pool).await?;
let top_admin = admins
Expand Down
20 changes: 6 additions & 14 deletions crates/api_common/src/websocket/send.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use lemmy_db_schema::{
person_mention::{PersonMention, PersonMentionInsertForm},
post::Post,
},
traits::{Crud, DeleteableOrRemoveable},
traits::Crud,
SubscribedType,
};
use lemmy_db_views::structs::{CommentView, LocalUserView, PostView, PrivateMessageView};
Expand All @@ -32,7 +32,7 @@ pub async fn send_post_ws_message<OP: ToString + Send + OperationType + 'static>
person_id: Option<PersonId>,
context: &LemmyContext,
) -> Result<PostResponse, LemmyError> {
let post_view = PostView::read(context.pool(), post_id, person_id).await?;
let post_view = PostView::read(context.pool(), post_id, person_id, Some(true)).await?;

let res = PostResponse { post_view };

Expand Down Expand Up @@ -65,11 +65,7 @@ pub async fn send_comment_ws_message<OP: ToString + Send + OperationType + 'stat
recipient_ids: Vec<LocalUserId>,
context: &LemmyContext,
) -> Result<CommentResponse, LemmyError> {
let mut view = CommentView::read(context.pool(), comment_id, person_id).await?;

if view.comment.deleted || view.comment.removed {
view.comment = view.comment.blank_out_deleted_or_removed_info();
}
let view = CommentView::read(context.pool(), comment_id, person_id).await?;

let mut res = CommentResponse {
comment_view: view,
Expand Down Expand Up @@ -98,7 +94,8 @@ pub async fn send_community_ws_message<OP: ToString + Send + OperationType + 'st
person_id: Option<PersonId>,
context: &LemmyContext,
) -> Result<CommunityResponse, LemmyError> {
let community_view = CommunityView::read(context.pool(), community_id, person_id).await?;
let community_view =
CommunityView::read(context.pool(), community_id, person_id, Some(true)).await?;
let discussion_languages = CommunityLanguage::read(context.pool(), community_id).await?;

let mut res = CommunityResponse {
Expand All @@ -124,12 +121,7 @@ pub async fn send_pm_ws_message<OP: ToString + Send + OperationType + 'static>(
websocket_id: Option<ConnectionId>,
context: &LemmyContext,
) -> Result<PrivateMessageResponse, LemmyError> {
let mut view = PrivateMessageView::read(context.pool(), private_message_id).await?;

// Blank out deleted or removed info
if view.private_message.deleted {
view.private_message = view.private_message.blank_out_deleted_or_removed_info();
}
let view = PrivateMessageView::read(context.pool(), private_message_id).await?;

let res = PrivateMessageResponse {
private_message_view: view,
Expand Down
2 changes: 1 addition & 1 deletion crates/api_crud/src/community/create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ impl PerformCrud for CreateCommunity {

let person_id = local_user_view.person.id;
let community_view =
CommunityView::read(context.pool(), inserted_community.id, Some(person_id)).await?;
CommunityView::read(context.pool(), inserted_community.id, Some(person_id), None).await?;
let discussion_languages =
CommunityLanguage::read(context.pool(), inserted_community.id).await?;

Expand Down
20 changes: 5 additions & 15 deletions crates/api_crud/src/community/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ use actix_web::web::Data;
use lemmy_api_common::{
community::{ListCommunities, ListCommunitiesResponse},
context::LemmyContext,
utils::{check_private_instance, get_local_user_view_from_jwt_opt},
utils::{check_private_instance, get_local_user_view_from_jwt_opt, is_admin},
};
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};

Expand All @@ -24,37 +24,27 @@ impl PerformCrud for ListCommunities {
get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
.await?;
let local_site = LocalSite::read(context.pool()).await?;
let is_admin = local_user_view.as_ref().map(|luv| is_admin(luv).is_ok());

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()
let communities = CommunityQuery::builder()
.pool(context.pool())
.listing_type(listing_type)
.sort(sort)
.local_user(local_user.as_ref())
.page(page)
.limit(limit)
.is_mod_or_admin(is_admin)
.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 })
}
Expand Down
45 changes: 25 additions & 20 deletions crates/api_crud/src/post/read.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@ use actix_web::web::Data;
use lemmy_api_common::{
context::LemmyContext,
post::{GetPost, GetPostResponse},
utils::{check_private_instance, get_local_user_view_from_jwt_opt, mark_post_as_read},
utils::{
check_private_instance,
get_local_user_view_from_jwt_opt,
is_mod_or_admin_opt,
mark_post_as_read,
},
};
use lemmy_db_schema::{
aggregates::structs::{PersonPostAggregates, PersonPostAggregatesForm},
source::{comment::Comment, local_site::LocalSite},
traits::{Crud, DeleteableOrRemoveable},
source::{comment::Comment, local_site::LocalSite, post::Post},
traits::Crud,
};
use lemmy_db_views::structs::PostView;
use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView};
Expand All @@ -32,7 +37,7 @@ impl PerformCrud for GetPost {

check_private_instance(&local_user_view, &local_site)?;

let person_id = local_user_view.map(|u| u.person.id);
let person_id = local_user_view.as_ref().map(|u| u.person.id);

// I'd prefer fetching the post_view by a comment join, but it adds a lot of boilerplate
let post_id = if let Some(id) = data.id {
Expand All @@ -46,7 +51,14 @@ impl PerformCrud for GetPost {
Err(LemmyError::from_message("couldnt_find_post"))?
};

let mut post_view = PostView::read(context.pool(), post_id, person_id)
// Check to see if the person is a mod or admin, to show deleted / removed
let community_id = Post::read(context.pool(), post_id).await?.community_id;
let is_mod_or_admin =
is_mod_or_admin_opt(context.pool(), local_user_view.as_ref(), Some(community_id))
.await
.is_ok();

let post_view = PostView::read(context.pool(), post_id, person_id, Some(is_mod_or_admin))
.await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_post"))?;

Expand All @@ -57,10 +69,14 @@ impl PerformCrud for GetPost {
}

// Necessary for the sidebar subscribed
let community_id = post_view.community.id;
let mut community_view = CommunityView::read(context.pool(), community_id, person_id)
.await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;
let community_view = CommunityView::read(
context.pool(),
community_id,
person_id,
Some(is_mod_or_admin),
)
.await
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?;

// Insert into PersonPostAggregates
// to update the read_comments count
Expand All @@ -77,17 +93,6 @@ impl PerformCrud for GetPost {
.map_err(|e| LemmyError::from_error_message(e, "couldnt_find_post"))?;
}

// Blank out deleted or removed info for non-logged in users
if person_id.is_none() {
if post_view.post.deleted || post_view.post.removed {
post_view.post = post_view.post.blank_out_deleted_or_removed_info();
}

if community_view.community.deleted || community_view.community.removed {
community_view.community = community_view.community.blank_out_deleted_or_removed_info();
}
}

let moderators = CommunityModeratorView::for_community(context.pool(), community_id).await?;

let online = context.chat_server().get_post_users_online(post_id)?;
Expand Down
12 changes: 0 additions & 12 deletions crates/api_crud/src/private_message/read.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ use lemmy_api_common::{
private_message::{GetPrivateMessages, PrivateMessagesResponse},
utils::get_local_user_view_from_jwt,
};
use lemmy_db_schema::traits::DeleteableOrRemoveable;
use lemmy_db_views::private_message_view::PrivateMessageQuery;
use lemmy_utils::{error::LemmyError, ConnectionId};

Expand Down Expand Up @@ -45,17 +44,6 @@ impl PerformCrud for GetPrivateMessages {
}
});

// Blank out deleted or removed info
for pmv in messages
.iter_mut()
.filter(|pmv| pmv.private_message.deleted)
{
pmv.private_message = pmv
.clone()
.private_message
.blank_out_deleted_or_removed_info();
}

Ok(PrivateMessagesResponse {
private_messages: messages,
})
Expand Down
3 changes: 2 additions & 1 deletion crates/apub/src/activities/following/accept.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,8 @@ impl ActivityHandler for AcceptFollow {

// Send the Subscribed message over websocket
// Re-read the community_view to get the new SubscribedType
let community_view = CommunityView::read(context.pool(), community_id, Some(person_id)).await?;
let community_view =
CommunityView::read(context.pool(), community_id, Some(person_id), None).await?;

// Get the local_user_id
let local_recipient_id = LocalUserView::read_person(context.pool(), person_id)
Expand Down

0 comments on commit 48f1871

Please sign in to comment.