From 3c0e6dac76b038aeacb4bec878589d91604f675b Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 12 Feb 2025 23:35:43 -0600 Subject: [PATCH] Try using offset pagination for account search --- src/controllers/api/search.ts | 8 ++++++-- src/utils/api.ts | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/controllers/api/search.ts b/src/controllers/api/search.ts index b3c80a2f..e5761f32 100644 --- a/src/controllers/api/search.ts +++ b/src/controllers/api/search.ts @@ -12,7 +12,7 @@ import { accountFromPubkey, renderAccount } from '@/views/mastodon/accounts.ts'; import { renderStatus } from '@/views/mastodon/statuses.ts'; import { getFollowedPubkeys } from '@/queries.ts'; import { getPubkeysBySearch } from '@/utils/search.ts'; -import { paginated } from '@/utils/api.ts'; +import { paginated, paginatedList } from '@/utils/api.ts'; const searchQuerySchema = z.object({ q: z.string().transform(decodeURIComponent), @@ -77,7 +77,11 @@ const searchController: AppController = async (c) => { hashtags: [], }; - return paginated(c, events, body); + if (result.data.type === 'accounts') { + return paginatedList(c, { ...result.data, ...params }, body); + } else { + return paginated(c, events, body); + } }; /** Get events for the search params. */ diff --git a/src/utils/api.ts b/src/utils/api.ts index ebe07748..91eda723 100644 --- a/src/utils/api.ts +++ b/src/utils/api.ts @@ -243,18 +243,18 @@ function buildListLinkHeader(url: string, params: { offset: number; limit: numbe function paginatedList( c: AppContext, params: { offset: number; limit: number }, - entities: unknown[], + body: object | unknown[], headers: HeaderRecord = {}, ) { const link = buildListLinkHeader(c.req.url, params); - const hasMore = entities.length > 0; + const hasMore = Array.isArray(body) ? body.length > 0 : true; if (link) { headers.link = hasMore ? link : link.split(', ').find((link) => link.endsWith('; rel="prev"'))!; } // Filter out undefined entities. - const results = entities.filter(Boolean); + const results = Array.isArray(body) ? body.filter(Boolean) : body; return c.json(results, 200, headers); }