From 77f5965cdc733b656b2355df3490275efbb9744b Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Wed, 25 Sep 2024 16:52:54 -0300 Subject: [PATCH] refactor: return zod errors in publicTimelineController --- src/controllers/api/timelines.ts | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/controllers/api/timelines.ts b/src/controllers/api/timelines.ts index 0f5808ba..8f783dd8 100644 --- a/src/controllers/api/timelines.ts +++ b/src/controllers/api/timelines.ts @@ -1,11 +1,10 @@ -import ISO6391 from 'iso-639-1'; import { NostrFilter } from '@nostrify/nostrify'; import { z } from 'zod'; import { type AppContext, type AppController } from '@/app.ts'; import { Conf } from '@/config.ts'; import { getFeedPubkeys } from '@/queries.ts'; -import { booleanParamSchema } from '@/schema.ts'; +import { booleanParamSchema, languageSchema } from '@/schema.ts'; import { hydrateEvents } from '@/storages/hydrate.ts'; import { paginated } from '@/utils/api.ts'; import { getTagSet } from '@/utils/tags.ts'; @@ -19,36 +18,37 @@ 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), + local: booleanParamSchema.default('false'), + instance: z.string().optional(), + language: languageSchema.optional(), }); const publicTimelineController: AppController = (c) => { const params = c.get('pagination'); - const { local, instance, language } = publicQuerySchema.parse(c.req.query()); + const result = publicQuerySchema.safeParse(c.req.query()); + + if (!result.success) { + return c.json({ error: 'Bad request', schema: result.error }, 400); + } + + const { local, instance, language } = result.data; const filter: NostrFilter = { kinds: [1], ...params }; + const search: `${string}:${string}`[] = []; + if (local) { - filter.search = `domain:${Conf.url.host}`; + search.push(`domain:${Conf.url.host}`); } else if (instance) { - filter.search = `domain:${instance}`; + search.push(`domain:${instance}`); } if (language) { - filter.search = filter.search + ' ' + `language:${language}`; + search.push(`language:${language}`); } + filter.search = search.join(' '); + return renderStatuses(c, [filter]); };