This commit is contained in:
Felix Ableitner 2024-11-18 12:30:54 +01:00
parent ce013f9904
commit ae78eaa3b1
3 changed files with 45 additions and 47 deletions

View file

@ -152,16 +152,7 @@ test("Only followers can view and interact with private community content", asyn
follow: true, follow: true,
}; };
await user.followCommunity(follow_form); await user.followCommunity(follow_form);
const pendingFollows1 = await waitUntil( approveFollower(alpha, alphaCommunityId);
() => listCommunityPendingFollows(alpha),
f => f.items.length == 1,
);
const approve = await approveCommunityPendingFollow(
alpha,
alphaCommunityId,
pendingFollows1.items[0].person.id,
);
expect(approve.success).toBe(true);
// now user can fetch posts and comments in community (using signed fetch), and create posts // now user can fetch posts and comments in community (using signed fetch), and create posts
await waitUntil( await waitUntil(
@ -283,7 +274,7 @@ test("Follow a private community and receive activities", async () => {
); );
}); });
test("Fetch remote content in private community", async () => { test.only("Fetch remote content in private community", async () => {
// create private community // create private community
const community = await createCommunity(alpha, randomString(10), "Private"); const community = await createCommunity(alpha, randomString(10), "Private");
expect(community.community_view.community.visibility).toBe("Private"); expect(community.community_view.community.visibility).toBe("Private");
@ -297,6 +288,7 @@ test("Fetch remote content in private community", async () => {
follow: true, follow: true,
}; };
await beta.followCommunity(follow_form_beta); await beta.followCommunity(follow_form_beta);
await approveFollower(alpha, alphaCommunityId);
// beta creates post and comment // beta creates post and comment
const post = await createPost(beta, betaCommunityId); const post = await createPost(beta, betaCommunityId);
@ -306,40 +298,35 @@ test("Fetch remote content in private community", async () => {
const comment_id = comment.comment_view.comment.id; const comment_id = comment.comment_view.comment.id;
expect(comment_id).toBeDefined(); expect(comment_id).toBeDefined();
// gamma is not following the community and cannot view nor create posts // create gamma user and follow community
const user = await registerUser(gamma, betaUrl);
const gammaCommunityId = ( const gammaCommunityId = (
await resolveCommunity(user, community.community_view.community.actor_id) await resolveCommunity(gamma, community.community_view.community.actor_id)
).community!.community.id; ).community!.community.id;
// follow the community and approve
const follow_form: FollowCommunity = { const follow_form: FollowCommunity = {
community_id: gammaCommunityId, community_id: gammaCommunityId,
follow: true, follow: true,
}; };
await user.followCommunity(follow_form); await gamma.followCommunity(follow_form);
const pendingFollows1 = await waitUntil( await approveFollower(alpha, alphaCommunityId);
() => listCommunityPendingFollows(alpha),
f => f.items.length == 1,
);
const approve = await approveCommunityPendingFollow(
alpha,
alphaCommunityId,
pendingFollows1.items[0].person.id,
);
expect(approve.success).toBe(true);
// now user can fetch posts and comments in community (using signed fetch), and create posts // now user can fetch posts and comments in community (using signed fetch), and create posts
console.log(1); let resolvedPost = await waitUntil(
await waitUntil( () => resolvePost(gamma, post.post_view.post),
() => resolvePost(user, post.post_view.post),
p => p?.post?.post.id != undefined, p => p?.post?.post.id != undefined,
); );
console.log(2); console.log(post.post_view.post);
console.log(resolvedPost.post?.post);
expect(resolvedPost.post?.post.ap_id).toBe(post.post_view.post.ap_id);
const resolvedComment = ( const resolvedComment = (
await resolveComment(user, comment.comment_view.comment) await resolveComment(gamma, comment.comment_view.comment)
).comment; ).comment;
expect(resolvedComment?.comment.id).toBeDefined(); expect(resolvedComment?.comment.ap_id).toBe(
comment.comment_view.comment.ap_id,
);
// TODO: this test should fail as check_has_followers_from_instance() on beta returns errors
// because it doesnt know the community follower. yet for some reason the test passes???
fail();
}); });
async function approveFollower(user: LemmyHttp, community_id: number) { async function approveFollower(user: LemmyHttp, community_id: number) {

View file

@ -17,8 +17,10 @@ use lemmy_db_schema::{
actor_language::CommunityLanguage, actor_language::CommunityLanguage,
comment::Comment, comment::Comment,
comment_reply::{CommentReply, CommentReplyInsertForm}, comment_reply::{CommentReply, CommentReplyInsertForm},
community::Community,
person::Person, person::Person,
person_mention::{PersonMention, PersonMentionInsertForm}, person_mention::{PersonMention, PersonMentionInsertForm},
post::Post,
}, },
traits::Crud, traits::Crud,
}; };
@ -101,17 +103,28 @@ pub async fn send_local_notifs(
let mut recipient_ids = Vec::new(); let mut recipient_ids = Vec::new();
let inbox_link = format!("{}/inbox", context.settings().get_protocol_and_hostname()); let inbox_link = format!("{}/inbox", context.settings().get_protocol_and_hostname());
// let person = my_local_user.person; // When called from api code, we have local user view and can read with CommentView
// Read the comment view to get extra info // to reduce db queries. But when receiving a federated comment the user view is None,
let comment_view = CommentView::read( // which means that comments inside private communities cant be read. As a workaround
&mut context.pool(), // we need to read the items manually to bypass this check.
comment_id, let (comment, post, community) = if let Some(local_user_view) = local_user_view {
local_user_view.map(|view| &view.local_user), let comment_view = CommentView::read(
) &mut context.pool(),
.await?; comment_id,
let comment = comment_view.comment; Some(&local_user_view.local_user),
let post = comment_view.post; )
let community = comment_view.community; .await?;
(
comment_view.comment,
comment_view.post,
comment_view.community,
)
} else {
let comment = Comment::read(&mut context.pool(), comment_id).await?;
let post = Post::read(&mut context.pool(), comment.post_id).await?;
let community = Community::read(&mut context.pool(), post.community_id).await?;
(comment, post, community)
};
// Send the local mentions // Send the local mentions
for mention in mentions for mention in mentions

View file

@ -174,9 +174,7 @@ impl ActivityHandler for CreateOrUpdateNote {
// TODO: this fails in local community comment as CommentView::read() returns nothing // TODO: this fails in local community comment as CommentView::read() returns nothing
// without passing LocalUser // without passing LocalUser
send_local_notifs(mentions, comment.id, &actor, do_send_email, context, None) send_local_notifs(mentions, comment.id, &actor, do_send_email, context, None).await?;
.await
.ok();
Ok(()) Ok(())
} }
} }