diff --git a/src/controllers/api/timelines.ts b/src/controllers/api/timelines.ts index 82e1cf3..6a442c1 100644 --- a/src/controllers/api/timelines.ts +++ b/src/controllers/api/timelines.ts @@ -1,4 +1,6 @@ +import { z } from '@/deps.ts'; import { getFeed, getPublicFeed } from '@/queries.ts'; +import { booleanParamSchema } from '@/schema.ts'; import { toStatus } from '@/transformers/nostr-to-mastoapi.ts'; import { buildLinkHeader, paginationSchema } from '@/utils.ts'; @@ -19,10 +21,15 @@ const homeController: AppController = async (c) => { return c.json(statuses, 200, link ? { link } : undefined); }; +const publicQuerySchema = z.object({ + local: booleanParamSchema.catch(false), +}); + const publicController: AppController = async (c) => { const params = paginationSchema.parse(c.req.query()); + const { local } = publicQuerySchema.parse(c.req.query()); - const events = await getPublicFeed(params); + const events = await getPublicFeed(params, local); if (!events.length) { return c.json([]); } diff --git a/src/queries.ts b/src/queries.ts index 0f4b3ec..9e17008 100644 --- a/src/queries.ts +++ b/src/queries.ts @@ -57,8 +57,8 @@ async function getFeed(pubkey: string, params: PaginationParams): Promise[]> { - return mixer.getFilters([{ kinds: [1], ...params }], { timeout: 5000 }); +function getPublicFeed(params: PaginationParams, local: boolean): Promise[]> { + return mixer.getFilters([{ kinds: [1], local, ...params }], { timeout: 5000 }); } async function getAncestors(event: Event<1>, result = [] as Event<1>[]): Promise[]> { diff --git a/src/schema.ts b/src/schema.ts index e56c1ae..3ecc76a 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -42,4 +42,7 @@ const hashtagSchema = z.string().regex(/^\w{1,30}$/); */ const safeUrlSchema = z.string().max(2048).url(); -export { decode64Schema, emojiTagSchema, filteredArray, hashtagSchema, jsonSchema, safeUrlSchema }; +/** https://github.com/colinhacks/zod/issues/1630#issuecomment-1365983831 */ +const booleanParamSchema = z.enum(['true', 'false']).transform((value) => value === 'true'); + +export { booleanParamSchema, decode64Schema, emojiTagSchema, filteredArray, hashtagSchema, jsonSchema, safeUrlSchema };