tldraw/apps/docs/pages/api/search.ts

46 lines
1.3 KiB
TypeScript
Raw Normal View History

2023-04-25 11:01:25 +00:00
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import { SearchResult } from '@/types/search-types'
import { getArticles, getSections } from '@/utils/content'
import type { NextApiRequest, NextApiResponse } from 'next'
type Data = {
results: SearchResult[]
}
export default async function handler(req: NextApiRequest, res: NextApiResponse<Data>) {
const { q, s } = req.query
const query = q?.toString().toLowerCase()
const activeId = s?.toString()
if (!query) return res.status(400).json({ results: [] })
const results: Data['results'] = []
const articles = await getArticles()
for (const section of await getSections()) {
for (const category of section.categories) {
for (const articleId of category.articleIds) {
if (activeId === articleId) continue
const article = articles[articleId]
if (
article.title.toLowerCase().includes(query) ||
(article.description && article.description.toLowerCase().includes(query)) ||
article.keywords.includes(query)
) {
results.push({
id: article.id,
type: 'article',
subtitle:
category.id === 'ucg' ? `${section.title}` : `${section.title} / ${category.title}`,
title: article.title,
url: `${section.id}/${category.id}/${article.id}`,
})
}
}
}
}
res.status(200).json({ results })
}