From 11adaef2438512c391023fe8b643b279f22161af Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 10 Feb 2025 17:08:29 -0600 Subject: [PATCH] homeTimelineController: support exclude_replies, only_media params --- src/controllers/api/accounts.ts | 2 +- src/controllers/api/timelines.ts | 31 ++++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/controllers/api/accounts.ts b/src/controllers/api/accounts.ts index 40b3e7b6..d3d67820 100644 --- a/src/controllers/api/accounts.ts +++ b/src/controllers/api/accounts.ts @@ -197,7 +197,7 @@ const accountStatusesQuerySchema = z.object({ limit: z.coerce.number().nonnegative().transform((v) => Math.min(v, 40)).catch(20), exclude_replies: booleanParamSchema.optional(), tagged: z.string().optional(), - only_media: z.coerce.boolean().optional(), + only_media: booleanParamSchema.optional(), }); const accountStatusesController: AppController = async (c) => { diff --git a/src/controllers/api/timelines.ts b/src/controllers/api/timelines.ts index fa5f44f6..f6bb8d37 100644 --- a/src/controllers/api/timelines.ts +++ b/src/controllers/api/timelines.ts @@ -10,11 +10,40 @@ import { paginated } from '@/utils/api.ts'; import { getTagSet } from '@/utils/tags.ts'; import { renderReblog, renderStatus } from '@/views/mastodon/statuses.ts'; +const homeQuerySchema = z.object({ + exclude_replies: booleanParamSchema.optional(), + only_media: booleanParamSchema.optional(), +}); + const homeTimelineController: AppController = async (c) => { const params = c.get('pagination'); const pubkey = await c.get('signer')?.getPublicKey()!; + const result = homeQuerySchema.safeParse(c.req.query()); + + if (!result.success) { + return c.json({ error: 'Bad request', schema: result.error }, 400); + } + + const { exclude_replies, only_media } = result.data; + const authors = [...await getFeedPubkeys(pubkey)]; - return renderStatuses(c, [{ authors, kinds: [1, 6, 20], ...params }]); + const filter: NostrFilter = { authors, kinds: [1, 6, 20], ...params }; + + const search: string[] = []; + + if (only_media) { + search.push('media:true'); + } + + if (exclude_replies) { + search.push('reply:false'); + } + + if (search.length) { + filter.search = search.join(' '); + } + + return renderStatuses(c, [filter]); }; const publicQuerySchema = z.object({