From dac11a90555eca06d04b98dd2d44a5a6d87c9db8 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Wed, 25 Sep 2024 13:56:14 -0300 Subject: [PATCH] feat: filter global and local feed by language add a 'language' field in publicQuerySchema --- src/controllers/api/timelines.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/controllers/api/timelines.ts b/src/controllers/api/timelines.ts index 483676e1..0f5808ba 100644 --- a/src/controllers/api/timelines.ts +++ b/src/controllers/api/timelines.ts @@ -1,3 +1,4 @@ +import ISO6391 from 'iso-639-1'; import { NostrFilter } from '@nostrify/nostrify'; import { z } from 'zod'; @@ -20,11 +21,21 @@ const homeTimelineController: AppController = async (c) => { const publicQuerySchema = z.object({ local: booleanParamSchema.catch(false), instance: z.string().optional().catch(undefined), + language: z.string().max(2).transform((val, ctx) => { + if (!ISO6391.validate(val)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Not a valid language in ISO-639-1 format', + }); + return z.NEVER; + } + return val; + }).optional().catch(undefined), }); const publicTimelineController: AppController = (c) => { const params = c.get('pagination'); - const { local, instance } = publicQuerySchema.parse(c.req.query()); + const { local, instance, language } = publicQuerySchema.parse(c.req.query()); const filter: NostrFilter = { kinds: [1], ...params }; @@ -34,6 +45,10 @@ const publicTimelineController: AppController = (c) => { filter.search = `domain:${instance}`; } + if (language) { + filter.search = filter.search + ' ' + `language:${language}`; + } + return renderStatuses(c, [filter]); };