|
1 | | -import type { NpmSearchResponse } from '#shared/types' |
2 | | -import { NPM_REGISTRY } from '#shared/utils/constants' |
| 1 | +import * as v from 'valibot' |
| 2 | +import { SearchQuerySchema } from '#shared/schemas/package' |
| 3 | +import { CACHE_MAX_AGE_ONE_MINUTE, NPM_REGISTRY } from '#shared/utils/constants' |
3 | 4 |
|
4 | 5 | export default defineCachedEventHandler( |
5 | 6 | async event => { |
6 | 7 | const query = getQuery(event) |
7 | | - const q = String(query.q || '').trim() |
8 | 8 |
|
9 | | - if (!q) { |
10 | | - return [q, []] |
11 | | - } |
| 9 | + try { |
| 10 | + const q = v.parse(SearchQuerySchema, query.q) |
| 11 | + |
| 12 | + if (!q) { |
| 13 | + return [q, []] |
| 14 | + } |
12 | 15 |
|
13 | | - const params = new URLSearchParams({ text: q, size: '10' }) |
14 | | - const response = await $fetch<NpmSearchResponse>(`${NPM_REGISTRY}/-/v1/search?${params}`) |
| 16 | + const params = new URLSearchParams({ text: q, size: '10' }) |
| 17 | + const response = await $fetch<NpmSearchResponse>(`${NPM_REGISTRY}/-/v1/search?${params}`) |
15 | 18 |
|
16 | | - const suggestions = response.objects.map(obj => obj.package.name) |
17 | | - return [q, suggestions] |
| 19 | + const suggestions = response.objects.map(obj => obj.package.name) |
| 20 | + return [q, suggestions] |
| 21 | + } catch (error: unknown) { |
| 22 | + handleApiError(error, { |
| 23 | + statusCode: 502, |
| 24 | + message: ERROR_SUGGESTIONS_FETCH_FAILED, |
| 25 | + }) |
| 26 | + } |
18 | 27 | }, |
19 | 28 | { |
20 | | - maxAge: 60, |
| 29 | + maxAge: CACHE_MAX_AGE_ONE_MINUTE, |
21 | 30 | swr: true, |
22 | 31 | getKey: event => { |
23 | 32 | const query = getQuery(event) |
24 | | - return `opensearch-suggestions:${query.q || ''}` |
| 33 | + const q = String(query.q || '').trim() |
| 34 | + return `opensearch-suggestions:${q}` |
25 | 35 | }, |
26 | 36 | }, |
27 | 37 | ) |
0 commit comments