From 34823aa7b88913c2018cf2fde11718f326a8b87d Mon Sep 17 00:00:00 2001 From: mia Date: Wed, 16 Oct 2024 05:07:57 -0700 Subject: [PATCH] [backend] Fetch pinned notes with following user fixes #567 --- packages/backend/src/models/repositories/user.ts | 8 ++++++++ .../backend/src/remote/activitypub/kernel/add/index.ts | 8 +++++++- .../backend/src/remote/activitypub/kernel/remove/index.ts | 6 +++--- packages/backend/src/remote/activitypub/models/person.ts | 4 ++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index 963c0daa7..4183e93bb 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -383,6 +383,14 @@ export const UserRepository = db.getRepository(User).extend({ }; }, + async getRandomFollower(targetId: string): Promise { + return await this.createQueryBuilder("u") + .select(`u.id`) + .leftJoinAndSelect("following", "f", `f."followerId" = u.id`) + .where(`f."followeeId" = :id`, { id: targetId }) + .getOne(); + }, + async packCached< ExpectsMe extends boolean | null = null, D extends boolean = false, diff --git a/packages/backend/src/remote/activitypub/kernel/add/index.ts b/packages/backend/src/remote/activitypub/kernel/add/index.ts index b3606e5d9..2801c90dd 100644 --- a/packages/backend/src/remote/activitypub/kernel/add/index.ts +++ b/packages/backend/src/remote/activitypub/kernel/add/index.ts @@ -2,6 +2,8 @@ import type { CacheableRemoteUser } from "@/models/entities/user.js"; import type { IAdd } from "../../type.js"; import { resolveNote } from "../../models/note.js"; import { addPinned } from "@/services/i/pin.js"; +import Resolver from "../../resolver.js"; +import { Users } from "@/models/index.js"; export default async ( actor: CacheableRemoteUser, @@ -16,7 +18,11 @@ export default async ( } if (activity.target === actor.featured) { - const note = await resolveNote(activity.object); + const resolver = new Resolver(); + const follower = await Users.getRandomFollower(actor.id); + if (follower) resolver.setUser(follower); + + const note = await resolveNote(activity.object, resolver); if (note == null) throw new Error("note not found"); await addPinned(actor, note.id); return; diff --git a/packages/backend/src/remote/activitypub/kernel/remove/index.ts b/packages/backend/src/remote/activitypub/kernel/remove/index.ts index 0b4be6b5f..aa64abdc6 100644 --- a/packages/backend/src/remote/activitypub/kernel/remove/index.ts +++ b/packages/backend/src/remote/activitypub/kernel/remove/index.ts @@ -1,6 +1,6 @@ import type { CacheableRemoteUser } from "@/models/entities/user.js"; import type { IRemove } from "../../type.js"; -import { resolveNote } from "../../models/note.js"; +import { fetchNote } from "../../models/note.js"; import { removePinned } from "@/services/i/pin.js"; export default async ( @@ -16,8 +16,8 @@ export default async ( } if (activity.target === actor.featured) { - const note = await resolveNote(activity.object); - if (note == null) throw new Error("note not found"); + const note = await fetchNote(activity.object); + if (note == null) return; // not pinned either way await removePinned(actor, note.id); return; } diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index 1d8913fb6..ce3f6109f 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -753,6 +753,10 @@ export async function updateFeatured(userId: User["id"], resolver?: Resolver, li if (resolver == null) resolver = new Resolver(); + // Attempt to get a local user that follows the remote user + const follower = await Users.getRandomFollower(userId); + if (follower) resolver.setUser(follower); + // Resolve to (Ordered)Collection Object const collection = await resolver.resolveCollection(user.featured); if (!isCollectionOrOrderedCollection(collection))