From c23e7cc20d445396c5a524febd2f7925e4a205a4 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 23 Aug 2021 11:25:39 -0400 Subject: [PATCH] Fixing ResolveObject API and unit tests (#1713) --- api_tests/package.json | 2 +- api_tests/src/comment.spec.ts | 59 ++++++++++------------ api_tests/src/community.spec.ts | 34 ++++++------- api_tests/src/follow.spec.ts | 6 +-- api_tests/src/post.spec.ts | 82 +++++++++++++------------------ api_tests/src/shared.ts | 66 ++++++++++--------------- api_tests/src/user.spec.ts | 10 ++-- api_tests/yarn.lock | 8 +-- crates/api/src/site.rs | 5 +- crates/api_common/src/site.rs | 12 ++--- crates/apub/src/fetcher/search.rs | 47 ++++++++++++------ 11 files changed, 153 insertions(+), 178 deletions(-) diff --git a/api_tests/package.json b/api_tests/package.json index e8e4cc091..33bb3e0b3 100644 --- a/api_tests/package.json +++ b/api_tests/package.json @@ -16,7 +16,7 @@ "eslint": "^7.30.0", "eslint-plugin-jane": "^9.0.3", "jest": "^27.0.6", - "lemmy-js-client": "0.11.4-rc.9", + "lemmy-js-client": "0.11.4-rc.14", "node-fetch": "^2.6.1", "prettier": "^2.3.2", "ts-jest": "^27.0.3", diff --git a/api_tests/src/comment.spec.ts b/api_tests/src/comment.spec.ts index 309cfd133..b1739d4b4 100644 --- a/api_tests/src/comment.spec.ts +++ b/api_tests/src/comment.spec.ts @@ -6,16 +6,16 @@ import { setupLogins, createPost, getPost, - searchComment, + resolveComment, likeComment, followBeta, - searchForBetaCommunity, + resolveBetaCommunity, createComment, editComment, deleteComment, removeComment, getMentions, - searchPost, + resolvePost, unfollowRemotes, createCommunity, registerUser, @@ -31,10 +31,10 @@ beforeAll(async () => { await setupLogins(); await followBeta(alpha); await followBeta(gamma); - let search = await searchForBetaCommunity(alpha); + let betaCommunity = (await resolveBetaCommunity(alpha)).community; postRes = await createPost( alpha, - search.communities.find(c => c.community.local == false).community.id + betaCommunity.community.id ); }); @@ -65,8 +65,7 @@ test('Create a comment', async () => { expect(commentRes.comment_view.counts.score).toBe(1); // Make sure that comment is liked on beta - let searchBeta = await searchComment(beta, commentRes.comment_view.comment); - let betaComment = searchBeta.comments[0]; + let betaComment = (await resolveComment(beta, commentRes.comment_view.comment)).comment; expect(betaComment).toBeDefined(); expect(betaComment.community.local).toBe(true); expect(betaComment.creator.local).toBe(false); @@ -82,8 +81,8 @@ test('Create a comment in a non-existent post', async () => { test('Update a comment', async () => { let commentRes = await createComment(alpha, postRes.post_view.post.id); // Federate the comment first - let searchBeta = await searchComment(beta, commentRes.comment_view.comment); - assertCommentFederation(searchBeta.comments[0], commentRes.comment_view); + let betaComment = (await resolveComment(beta, commentRes.comment_view.comment)).comment; + assertCommentFederation(betaComment, commentRes.comment_view); let updateCommentRes = await editComment( alpha, @@ -96,12 +95,12 @@ test('Update a comment', async () => { expect(updateCommentRes.comment_view.creator.local).toBe(true); // Make sure that post is updated on beta - let searchBetaUpdated = await searchComment( + let betaCommentUpdated = (await resolveComment( beta, commentRes.comment_view.comment - ); + )).comment; assertCommentFederation( - searchBetaUpdated.comments[0], + betaCommentUpdated, updateCommentRes.comment_view ); }); @@ -118,9 +117,8 @@ test('Delete a comment', async () => { expect(deleteCommentRes.comment_view.comment.content).toBe(""); // Make sure that comment is undefined on beta - let searchBeta = await searchComment(beta, commentRes.comment_view.comment); - let betaComment = searchBeta.comments[0]; - expect(betaComment).toBeUndefined(); + let betaCommentRes: any = await resolveComment(beta, commentRes.comment_view.comment); + expect(betaCommentRes).toStrictEqual({ error: 'couldnt_find_object' }); let undeleteCommentRes = await deleteComment( alpha, @@ -130,11 +128,10 @@ test('Delete a comment', async () => { expect(undeleteCommentRes.comment_view.comment.deleted).toBe(false); // Make sure that comment is undeleted on beta - let searchBeta2 = await searchComment(beta, commentRes.comment_view.comment); - let betaComment2 = searchBeta2.comments[0]; + let betaComment2 = (await resolveComment(beta, commentRes.comment_view.comment)).comment; expect(betaComment2.comment.deleted).toBe(false); assertCommentFederation( - searchBeta2.comments[0], + betaComment2, undeleteCommentRes.comment_view ); }); @@ -144,8 +141,8 @@ test('Remove a comment from admin and community on the same instance', async () // Get the id for beta let betaCommentId = ( - await searchComment(beta, commentRes.comment_view.comment) - ).comments[0].comment.id; + await resolveComment(beta, commentRes.comment_view.comment) + ).comment.comment.id; // The beta admin removes it (the community lives on beta) let removeCommentRes = await removeComment(beta, true, betaCommentId); @@ -185,8 +182,7 @@ test('Remove a comment from admin and community on different instance', async () expect(commentRes.comment_view.comment.content).toBeDefined(); // Beta searches that to cache it, then removes it - let searchBeta = await searchComment(beta, commentRes.comment_view.comment); - let betaComment = searchBeta.comments[0]; + let betaComment = (await resolveComment(beta, commentRes.comment_view.comment)).comment; let removeCommentRes = await removeComment( beta, true, @@ -206,8 +202,7 @@ test('Unlike a comment', async () => { expect(unlike.comment_view.counts.score).toBe(0); // Make sure that post is unliked on beta - let searchBeta = await searchComment(beta, commentRes.comment_view.comment); - let betaComment = searchBeta.comments[0]; + let betaComment = (await resolveComment(beta, commentRes.comment_view.comment)).comment; expect(betaComment).toBeDefined(); expect(betaComment.community.local).toBe(true); expect(betaComment.creator.local).toBe(false); @@ -218,8 +213,7 @@ test('Federated comment like', async () => { let commentRes = await createComment(alpha, postRes.post_view.post.id); // Find the comment on beta - let searchBeta = await searchComment(beta, commentRes.comment_view.comment); - let betaComment = searchBeta.comments[0]; + let betaComment = (await resolveComment(beta, commentRes.comment_view.comment)).comment; let like = await likeComment(beta, 1, betaComment.comment); expect(like.comment_view.counts.score).toBe(2); @@ -232,8 +226,7 @@ test('Federated comment like', async () => { test('Reply to a comment', async () => { // Create a comment on alpha, find it on beta let commentRes = await createComment(alpha, postRes.post_view.post.id); - let searchBeta = await searchComment(beta, commentRes.comment_view.comment); - let betaComment = searchBeta.comments[0]; + let betaComment = (await resolveComment(beta, commentRes.comment_view.comment)).comment; // find that comment id on beta @@ -287,8 +280,8 @@ test('Mention beta', async () => { test('Comment Search', async () => { let commentRes = await createComment(alpha, postRes.post_view.post.id); - let searchBeta = await searchComment(beta, commentRes.comment_view.comment); - assertCommentFederation(searchBeta.comments[0], commentRes.comment_view); + let betaComment = (await resolveComment(beta, commentRes.comment_view.comment)).comment; + assertCommentFederation(betaComment, commentRes.comment_view); }); test('A and G subscribe to B (center) A posts, G mentions B, it gets announced to A', async () => { @@ -297,8 +290,7 @@ test('A and G subscribe to B (center) A posts, G mentions B, it gets announced t expect(alphaPost.post_view.community.local).toBe(true); // Make sure gamma sees it - let search = await searchPost(gamma, alphaPost.post_view.post); - let gammaPost = search.posts[0]; + let gammaPost = (await resolvePost(gamma, alphaPost.post_view.post)).post; let commentContent = 'A jest test federated comment announce, lets mention @lemmy_beta@lemmy-beta:8551'; @@ -379,8 +371,7 @@ test('Fetch in_reply_tos: A is unsubbed from B, B makes a post, and some embedde expect(updateRes.comment_view.comment.content).toBe(updatedCommentContent); // Get the post from alpha - let search = await searchPost(alpha, postRes.post_view.post); - let alphaPostB = search.posts[0]; + let alphaPostB = (await resolvePost(alpha, postRes.post_view.post)).post; let alphaPost = await getPost(alpha, alphaPostB.post.id); expect(alphaPost.post_view.post.name).toBeDefined(); diff --git a/api_tests/src/community.spec.ts b/api_tests/src/community.spec.ts index 3d4a3a350..cdbb99e00 100644 --- a/api_tests/src/community.spec.ts +++ b/api_tests/src/community.spec.ts @@ -3,7 +3,7 @@ import { alpha, beta, setupLogins, - searchForCommunity, + resolveCommunity, createCommunity, deleteCommunity, removeCommunity, @@ -47,9 +47,8 @@ test('Create community', async () => { // Cache the community on beta, make sure it has the other fields let searchShort = `!${prevName}@lemmy-alpha:8541`; - let search = await searchForCommunity(beta, searchShort); - let communityOnBeta = search.communities[0]; - assertCommunityFederation(communityOnBeta, communityRes.community_view); + let betaCommunity = (await resolveCommunity(beta, searchShort)).community; + assertCommunityFederation(betaCommunity, communityRes.community_view); }); test('Delete community', async () => { @@ -57,15 +56,14 @@ test('Delete community', async () => { // Cache the community on Alpha let searchShort = `!${communityRes.community_view.community.name}@lemmy-beta:8551`; - let search = await searchForCommunity(alpha, searchShort); - let communityOnAlpha = search.communities[0]; - assertCommunityFederation(communityOnAlpha, communityRes.community_view); + let alphaCommunity = (await resolveCommunity(alpha, searchShort)).community; + assertCommunityFederation(alphaCommunity, communityRes.community_view); // Follow the community from alpha let follow = await followCommunity( alpha, true, - communityOnAlpha.community.id + alphaCommunity.community.id ); // Make sure the follow response went through @@ -82,7 +80,7 @@ test('Delete community', async () => { // Make sure it got deleted on A let communityOnAlphaDeleted = await getCommunity( alpha, - communityOnAlpha.community.id + alphaCommunity.community.id ); expect(communityOnAlphaDeleted.community_view.community.deleted).toBe(true); @@ -97,7 +95,7 @@ test('Delete community', async () => { // Make sure it got undeleted on A let communityOnAlphaUnDeleted = await getCommunity( alpha, - communityOnAlpha.community.id + alphaCommunity.community.id ); expect(communityOnAlphaUnDeleted.community_view.community.deleted).toBe( false @@ -109,15 +107,14 @@ test('Remove community', async () => { // Cache the community on Alpha let searchShort = `!${communityRes.community_view.community.name}@lemmy-beta:8551`; - let search = await searchForCommunity(alpha, searchShort); - let communityOnAlpha = search.communities[0]; - assertCommunityFederation(communityOnAlpha, communityRes.community_view); + let alphaCommunity = (await resolveCommunity(alpha, searchShort)).community; + assertCommunityFederation(alphaCommunity, communityRes.community_view); // Follow the community from alpha let follow = await followCommunity( alpha, true, - communityOnAlpha.community.id + alphaCommunity.community.id ); // Make sure the follow response went through @@ -134,7 +131,7 @@ test('Remove community', async () => { // Make sure it got Removed on A let communityOnAlphaRemoved = await getCommunity( alpha, - communityOnAlpha.community.id + alphaCommunity.community.id ); expect(communityOnAlphaRemoved.community_view.community.removed).toBe(true); @@ -149,7 +146,7 @@ test('Remove community', async () => { // Make sure it got undeleted on A let communityOnAlphaUnRemoved = await getCommunity( alpha, - communityOnAlpha.community.id + alphaCommunity.community.id ); expect(communityOnAlphaUnRemoved.community_view.community.removed).toBe( false @@ -161,7 +158,6 @@ test('Search for beta community', async () => { expect(communityRes.community_view.community.name).toBeDefined(); let searchShort = `!${communityRes.community_view.community.name}@lemmy-beta:8551`; - let search = await searchForCommunity(alpha, searchShort); - let communityOnAlpha = search.communities[0]; - assertCommunityFederation(communityOnAlpha, communityRes.community_view); + let alphaCommunity = (await resolveCommunity(alpha, searchShort)).community; + assertCommunityFederation(alphaCommunity, communityRes.community_view); }); diff --git a/api_tests/src/follow.spec.ts b/api_tests/src/follow.spec.ts index 369a772a1..078c382c2 100644 --- a/api_tests/src/follow.spec.ts +++ b/api_tests/src/follow.spec.ts @@ -2,7 +2,7 @@ jest.setTimeout(120000); import { alpha, setupLogins, - searchForBetaCommunity, + resolveBetaCommunity, followCommunity, unfollowRemotes, getSite, @@ -17,11 +17,11 @@ afterAll(async () => { }); test('Follow federated community', async () => { - let search = await searchForBetaCommunity(alpha); // TODO sometimes this is returning null? + let betaCommunity = (await resolveBetaCommunity(alpha)).community; let follow = await followCommunity( alpha, true, - search.communities[0].community.id + betaCommunity.community.id ); // Make sure the follow response went through diff --git a/api_tests/src/post.spec.ts b/api_tests/src/post.spec.ts index c5630f336..8836a2c76 100644 --- a/api_tests/src/post.spec.ts +++ b/api_tests/src/post.spec.ts @@ -10,16 +10,16 @@ import { editPost, stickyPost, lockPost, - searchPost, + resolvePost, likePost, followBeta, - searchForBetaCommunity, + resolveBetaCommunity, createComment, deletePost, removePost, getPost, unfollowRemotes, - searchForUser, + resolvePerson, banPersonFromSite, searchPostLocal, followCommunity, @@ -31,8 +31,8 @@ let betaCommunity: CommunityView; beforeAll(async () => { await setupLogins(); - let search = await searchForBetaCommunity(alpha); - betaCommunity = search.communities[0]; + betaCommunity = (await resolveBetaCommunity(alpha)).community; + expect(betaCommunity).toBeDefined(); await unfollows(); }); @@ -71,8 +71,7 @@ test('Create a post', async () => { expect(postRes.post_view.counts.score).toBe(1); // Make sure that post is liked on beta - let searchBeta = await searchPost(beta, postRes.post_view.post); - let betaPost = searchBeta.posts[0]; + let betaPost = (await resolvePost(beta, postRes.post_view.post)).post; expect(betaPost).toBeDefined(); expect(betaPost.community.local).toBe(true); @@ -81,12 +80,12 @@ test('Create a post', async () => { assertPostFederation(betaPost, postRes.post_view); // Delta only follows beta, so it should not see an alpha ap_id - let searchDelta = await searchPost(delta, postRes.post_view.post); - expect(searchDelta.posts[0]).toBeUndefined(); + let deltaPost = (await resolvePost(delta, postRes.post_view.post)).post; + expect(deltaPost).toBeUndefined(); // Epsilon has alpha blocked, it should not see the alpha post - let searchEpsilon = await searchPost(epsilon, postRes.post_view.post); - expect(searchEpsilon.posts[0]).toBeUndefined(); + let epsilonPost = (await resolvePost(epsilon, postRes.post_view.post)).post; + expect(epsilonPost).toBeUndefined(); }); test('Create a post in a non-existent community', async () => { @@ -104,8 +103,7 @@ test('Unlike a post', async () => { expect(unlike2.post_view.counts.score).toBe(0); // Make sure that post is unliked on beta - let searchBeta = await searchPost(beta, postRes.post_view.post); - let betaPost = searchBeta.posts[0]; + let betaPost = (await resolvePost(beta, postRes.post_view.post)).post; expect(betaPost).toBeDefined(); expect(betaPost.community.local).toBe(true); expect(betaPost.creator.local).toBe(false); @@ -123,8 +121,7 @@ test('Update a post', async () => { expect(updatedPost.post_view.creator.local).toBe(true); // Make sure that post is updated on beta - let searchBeta = await searchPost(beta, postRes.post_view.post); - let betaPost = searchBeta.posts[0]; + let betaPost = (await resolvePost(beta, postRes.post_view.post)).post; expect(betaPost.community.local).toBe(true); expect(betaPost.creator.local).toBe(false); expect(betaPost.post.name).toBe(updatedName); @@ -142,8 +139,7 @@ test('Sticky a post', async () => { expect(stickiedPostRes.post_view.post.stickied).toBe(true); // Make sure that post is stickied on beta - let searchBeta = await searchPost(beta, postRes.post_view.post); - let betaPost = searchBeta.posts[0]; + let betaPost = (await resolvePost(beta, postRes.post_view.post)).post; expect(betaPost.community.local).toBe(true); expect(betaPost.creator.local).toBe(false); expect(betaPost.post.stickied).toBe(true); @@ -153,18 +149,15 @@ test('Sticky a post', async () => { expect(unstickiedPost.post_view.post.stickied).toBe(false); // Make sure that post is unstickied on beta - let searchBeta2 = await searchPost(beta, postRes.post_view.post); - let betaPost2 = searchBeta2.posts[0]; + let betaPost2 = (await resolvePost(beta, postRes.post_view.post)).post; expect(betaPost2.community.local).toBe(true); expect(betaPost2.creator.local).toBe(false); expect(betaPost2.post.stickied).toBe(false); // Make sure that gamma cannot sticky the post on beta - let searchGamma = await searchPost(gamma, postRes.post_view.post); - let gammaPost = searchGamma.posts[0]; + let gammaPost = (await resolvePost(gamma, postRes.post_view.post)).post; let gammaTrySticky = await stickyPost(gamma, true, gammaPost.post); - let searchBeta3 = await searchPost(beta, postRes.post_view.post); - let betaPost3 = searchBeta3.posts[0]; + let betaPost3 = (await resolvePost(beta, postRes.post_view.post)).post; expect(gammaTrySticky.post_view.post.stickied).toBe(true); expect(betaPost3.post.stickied).toBe(false); }); @@ -174,8 +167,7 @@ test('Lock a post', async () => { let postRes = await createPost(alpha, betaCommunity.community.id); // Lock the post - let searchBeta = await searchPost(beta, postRes.post_view.post); - let betaPost1 = searchBeta.posts[0]; + let betaPost1 = (await resolvePost(beta, postRes.post_view.post)).post; let lockedPostRes = await lockPost(beta, true, betaPost1.post); expect(lockedPostRes.post_view.post.locked).toBe(true); @@ -213,8 +205,7 @@ test('Delete a post', async () => { expect(deletedPost.post_view.post.name).toBe(""); // Make sure lemmy beta sees post is deleted - let searchBeta = await searchPost(beta, postRes.post_view.post); - let betaPost = searchBeta.posts[0]; + let betaPost = (await resolvePost(beta, postRes.post_view.post)).post; // This will be undefined because of the tombstone expect(betaPost).toBeUndefined(); @@ -223,8 +214,7 @@ test('Delete a post', async () => { expect(undeletedPost.post_view.post.deleted).toBe(false); // Make sure lemmy beta sees post is undeleted - let searchBeta2 = await searchPost(beta, postRes.post_view.post); - let betaPost2 = searchBeta2.posts[0]; + let betaPost2 = (await resolvePost(beta, postRes.post_view.post)).post; expect(betaPost2.post.deleted).toBe(false); assertPostFederation(betaPost2, undeletedPost.post_view); @@ -241,8 +231,7 @@ test('Remove a post from admin and community on different instance', async () => expect(removedPost.post_view.post.name).toBe(""); // Make sure lemmy beta sees post is NOT removed - let searchBeta = await searchPost(beta, postRes.post_view.post); - let betaPost = searchBeta.posts[0]; + let betaPost = (await resolvePost(beta, postRes.post_view.post)).post; expect(betaPost.post.removed).toBe(false); // Undelete @@ -250,8 +239,7 @@ test('Remove a post from admin and community on different instance', async () => expect(undeletedPost.post_view.post.removed).toBe(false); // Make sure lemmy beta sees post is undeleted - let searchBeta2 = await searchPost(beta, postRes.post_view.post); - let betaPost2 = searchBeta2.posts[0]; + let betaPost2 = (await resolvePost(beta, postRes.post_view.post)).post; expect(betaPost2.post.removed).toBe(false); assertPostFederation(betaPost2, undeletedPost.post_view); }); @@ -291,27 +279,26 @@ test('Search for a post', async () => { let postRes = await createPost(alpha, betaCommunity.community.id); expect(postRes.post_view.post).toBeDefined(); - let searchBeta = await searchPost(beta, postRes.post_view.post); + let betaPost = (await resolvePost(beta, postRes.post_view.post)).post; - expect(searchBeta.posts[0].post.name).toBeDefined(); + expect(betaPost.post.name).toBeDefined(); }); test('A and G subscribe to B (center) A posts, it gets announced to G', async () => { let postRes = await createPost(alpha, betaCommunity.community.id); expect(postRes.post_view.post).toBeDefined(); - let search2 = await searchPost(gamma, postRes.post_view.post); - expect(search2.posts[0].post.name).toBeDefined(); + let betaPost = (await resolvePost(gamma, postRes.post_view.post)).post; + expect(betaPost.post.name).toBeDefined(); }); test('Enforce site ban for federated user', async () => { let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`; - let userSearch = await searchForUser(beta, alphaShortname); - let alphaUser = userSearch.users[0]; - expect(alphaUser).toBeDefined(); + let alphaPerson = (await resolvePerson(beta, alphaShortname)).person; + expect(alphaPerson).toBeDefined(); // ban alpha from beta site - let banAlpha = await banPersonFromSite(beta, alphaUser.person.id, true); + let banAlpha = await banPersonFromSite(beta, alphaPerson.person.id, true); expect(banAlpha.banned).toBe(true); // Alpha makes post on beta @@ -327,19 +314,18 @@ test('Enforce site ban for federated user', async () => { expect(betaPost).toBeUndefined(); // Unban alpha - let unBanAlpha = await banPersonFromSite(beta, alphaUser.person.id, false); + let unBanAlpha = await banPersonFromSite(beta, alphaPerson.person.id, false); expect(unBanAlpha.banned).toBe(false); }); test('Enforce community ban for federated user', async () => { let alphaShortname = `@lemmy_alpha@lemmy-alpha:8541`; - let userSearch = await searchForUser(beta, alphaShortname); - let alphaUser = userSearch.users[0]; - expect(alphaUser).toBeDefined(); + let alphaPerson = (await resolvePerson(beta, alphaShortname)).person; + expect(alphaPerson).toBeDefined(); // ban alpha from beta site - await banPersonFromCommunity(beta, alphaUser.person.id, 2, false); - let banAlpha = await banPersonFromCommunity(beta, alphaUser.person.id, 2, true); + await banPersonFromCommunity(beta, alphaPerson.person.id, 2, false); + let banAlpha = await banPersonFromCommunity(beta, alphaPerson.person.id, 2, true); expect(banAlpha.banned).toBe(true); // Alpha tries to make post on beta, but it fails because of ban @@ -349,7 +335,7 @@ test('Enforce community ban for federated user', async () => { // Unban alpha let unBanAlpha = await banPersonFromCommunity( beta, - alphaUser.person.id, + alphaPerson.person.id, 2, false ); diff --git a/api_tests/src/shared.ts b/api_tests/src/shared.ts index 2de66c05b..1a1f9a5c3 100644 --- a/api_tests/src/shared.ts +++ b/api_tests/src/shared.ts @@ -47,6 +47,8 @@ import { BanFromCommunityResponse, Post, CreatePrivateMessage, + ResolveObjectResponse, + ResolveObject, } from 'lemmy-js-client'; export interface API { @@ -201,16 +203,14 @@ export async function lockPost( return api.client.lockPost(form); } -export async function searchPost( +export async function resolvePost( api: API, post: Post -): Promise { - let form: Search = { +): Promise { + let form: ResolveObject = { q: post.ap_id, - type_: SearchType.Posts, - sort: SortType.TopAll, }; - return api.client.search(form); + return api.client.resolveObject(form); } export async function searchPostLocal( @@ -235,56 +235,44 @@ export async function getPost( return api.client.getPost(form); } -export async function searchComment( +export async function resolveComment( api: API, comment: Comment -): Promise { - let form: Search = { +): Promise { + let form: ResolveObject = { q: comment.ap_id, - type_: SearchType.Comments, - sort: SortType.TopAll, }; - return api.client.search(form); + return api.client.resolveObject(form); } -export async function searchForBetaCommunity( +export async function resolveBetaCommunity( api: API -): Promise { - // Make sure lemmy-beta/c/main is cached on lemmy_alpha +): Promise { // Use short-hand search url - let form: Search = { + let form: ResolveObject = { q: '!main@lemmy-beta:8551', - type_: SearchType.Communities, - sort: SortType.TopAll, }; - return api.client.search(form); + return api.client.resolveObject(form); } -export async function searchForCommunity( +export async function resolveCommunity( api: API, q: string -): Promise { - // Use short-hand search url - let form: Search = { +): Promise { + let form: ResolveObject = { q, - type_: SearchType.Communities, - sort: SortType.TopAll, }; - return api.client.search(form); + return api.client.resolveObject(form); } -export async function searchForUser( +export async function resolvePerson( api: API, apShortname: string -): Promise { - // Make sure lemmy-beta/c/main is cached on lemmy_alpha - // Use short-hand search url - let form: Search = { +): Promise { + let form: ResolveObject = { q: apShortname, - type_: SearchType.Users, - sort: SortType.TopAll, }; - return api.client.search(form); + return api.client.resolveObject(form); } export async function banPersonFromSite( @@ -293,7 +281,6 @@ export async function banPersonFromSite( ban: boolean ): Promise { // Make sure lemmy-beta/c/main is cached on lemmy_alpha - // Use short-hand search url let form: BanPerson = { person_id, ban, @@ -310,7 +297,6 @@ export async function banPersonFromCommunity( ban: boolean ): Promise { // Make sure lemmy-beta/c/main is cached on lemmy_alpha - // Use short-hand search url let form: BanFromCommunity = { person_id, community_id, @@ -591,11 +577,9 @@ export async function unfollowRemotes( } export async function followBeta(api: API): Promise { - // Cache it - let search = await searchForBetaCommunity(api); - let com = search.communities.find(c => c.community.local == false); - if (com) { - let follow = await followCommunity(api, true, com.community.id); + let betaCommunity = (await resolveBetaCommunity(api)).community; + if (betaCommunity) { + let follow = await followCommunity(api, true, betaCommunity.community.id); return follow; } } diff --git a/api_tests/src/user.spec.ts b/api_tests/src/user.spec.ts index acbe8fe15..788987e2c 100644 --- a/api_tests/src/user.spec.ts +++ b/api_tests/src/user.spec.ts @@ -3,7 +3,7 @@ import { alpha, beta, registerUser, - searchForUser, + resolvePerson, saveUserSettings, getSite, } from './shared'; @@ -56,9 +56,7 @@ test('Set some user settings, check that they are federated', async () => { }; await saveUserSettings(alpha, form); - let searchAlpha = await searchForUser(alpha, apShortname); - let userOnAlpha = searchAlpha.users[0]; - let searchBeta = await searchForUser(beta, apShortname); - let userOnBeta = searchBeta.users[0]; - assertUserFederation(userOnAlpha, userOnBeta); + let alphaPerson = (await resolvePerson(alpha, apShortname)).person; + let betaPerson = (await resolvePerson(beta, apShortname)).person; + assertUserFederation(alphaPerson, betaPerson); }); diff --git a/api_tests/yarn.lock b/api_tests/yarn.lock index 370873b1e..e148c0fd2 100644 --- a/api_tests/yarn.lock +++ b/api_tests/yarn.lock @@ -3076,10 +3076,10 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "~0.3.2" -lemmy-js-client@0.11.4-rc.9: - version "0.11.4-rc.9" - resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.11.4-rc.9.tgz#f7b3c73691e4c1600daf3840d22d9cfbddc5f363" - integrity sha512-zP8JxWzQU+yuyE8cMG0GzR8aR3lJ++G5zzbynsXwDevzAZXhOm0ObNNtJiA3Q5msStFVKVYa3GwZxBv4XiYshw== +lemmy-js-client@0.11.4-rc.14: + version "0.11.4-rc.14" + resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.11.4-rc.14.tgz#dcac5b8dc78c3b04e6b3630ff9351a94aa73e109" + integrity sha512-R8M+myyriNQljQlTweVqtUKGBpgmaM7RI4ebYb7N7sYr5Bk5Ip6v2qTNvKAV6BlsDOCTWANOonfeoz/cIerLEg== leven@^3.1.0: version "3.1.0" diff --git a/crates/api/src/site.rs b/crates/api/src/site.rs index 315cf72da..b80467e37 100644 --- a/crates/api/src/site.rs +++ b/crates/api/src/site.rs @@ -376,7 +376,10 @@ impl Perform for ResolveObject { _websocket_id: Option, ) -> Result { let local_user_view = get_local_user_view_from_jwt_opt(&self.auth, context.pool()).await?; - search_by_apub_id(&self.q, local_user_view, context).await + let res = search_by_apub_id(&self.q, local_user_view, context) + .await + .map_err(|_| ApiError::err("couldnt_find_object"))?; + Ok(res) } } diff --git a/crates/api_common/src/site.rs b/crates/api_common/src/site.rs index ed6211781..03f86f3dc 100644 --- a/crates/api_common/src/site.rs +++ b/crates/api_common/src/site.rs @@ -56,12 +56,12 @@ pub struct ResolveObject { pub auth: Option, } -#[derive(Serialize, Debug)] -pub enum ResolveObjectResponse { - Comment(CommentView), - Post(PostView), - Community(CommunityView), - Person(PersonViewSafe), +#[derive(Serialize, Default)] +pub struct ResolveObjectResponse { + pub comment: Option, + pub post: Option, + pub community: Option, + pub person: Option, } #[derive(Deserialize)] diff --git a/crates/apub/src/fetcher/search.rs b/crates/apub/src/fetcher/search.rs index 6f081c8b4..70e7c40c1 100644 --- a/crates/apub/src/fetcher/search.rs +++ b/crates/apub/src/fetcher/search.rs @@ -83,7 +83,10 @@ pub async fn search_by_apub_id( CommunityView::read(conn, community.id, local_user_view.map(|l| l.person.id)) }) .await??; - Ok(ResolveObjectResponse::Community(res)) + Ok(ResolveObjectResponse { + community: Some(res), + ..ResolveObjectResponse::default() + }) } WebfingerType::Person => { let res = blocking(context.pool(), move |conn| { @@ -91,7 +94,10 @@ pub async fn search_by_apub_id( PersonViewSafe::read(conn, person.id) }) .await??; - Ok(ResolveObjectResponse::Person(res)) + Ok(ResolveObjectResponse { + person: Some(res), + ..ResolveObjectResponse::default() + }) } }; } @@ -126,36 +132,47 @@ async fn build_response( let person_uri = p.id(&query_url)?; let person = get_or_fetch_and_upsert_person(person_uri, context, recursion_counter).await?; - ROR::Person( - blocking(context.pool(), move |conn| { + ROR { + person: blocking(context.pool(), move |conn| { PersonViewSafe::read(conn, person.id) }) - .await??, - ) + .await? + .ok(), + ..ROR::default() + } } SearchAcceptedObjects::Group(g) => { let community_uri = g.id(&query_url)?; let community = get_or_fetch_and_upsert_community(community_uri, context, recursion_counter).await?; - ROR::Community( - blocking(context.pool(), move |conn| { + ROR { + community: blocking(context.pool(), move |conn| { CommunityView::read(conn, community.id, None) }) - .await??, - ) + .await? + .ok(), + ..ROR::default() + } } SearchAcceptedObjects::Page(p) => { let p = Post::from_apub(&p, context, &query_url, recursion_counter).await?; - ROR::Post(blocking(context.pool(), move |conn| PostView::read(conn, p.id, None)).await??) + ROR { + post: blocking(context.pool(), move |conn| PostView::read(conn, p.id, None)) + .await? + .ok(), + ..ROR::default() + } } SearchAcceptedObjects::Comment(c) => { let c = Comment::from_apub(&c, context, &query_url, recursion_counter).await?; - ROR::Comment( - blocking(context.pool(), move |conn| { + ROR { + comment: blocking(context.pool(), move |conn| { CommentView::read(conn, c.id, None) }) - .await??, - ) + .await? + .ok(), + ..ROR::default() + } } }) }