fedisearch/application/src/pages/api/feed.ts

75 wiersze
2.0 KiB
TypeScript

import prisma from '../../lib/prisma'
import { pageLimit } from '../../lib/pageLimit'
import { feedRequestSchema } from '../../types/FeedRequest'
import { NextApiRequest, NextApiResponse } from 'next'
import { FeedResponse } from '../../types/FeedResponse'
const handleFeedSearch = async (req:NextApiRequest, res:NextApiResponse<FeedResponse>):Promise<void> => {
console.info('Searching feeds', { query: req.query })
const feedRequest = feedRequestSchema.parse(req.query)
const phrases = feedRequest.search.trim().split(/[\s+]+/)
const feeds = await prisma.feed.findMany({
where: {
OR: [
{
fulltext: {
search: phrases.join(' & '),
mode: 'insensitive'
}
},
{
AND: phrases.map(phrase => {
return {
fulltext: {
contains: phrase,
mode: 'insensitive'
}
}
})
}
]
},
take: pageLimit + 1,
skip: (feedRequest.page ?? 0) * pageLimit,
include: {
emails: true,
fields: true,
node: true
}
})
res.status(200)
.json({
hasMore: typeof feeds[pageLimit] !== 'undefined',
feeds: feeds.slice(0, pageLimit).map(feed => {
return {
avatar: feed.avatar,
bot: feed.bot,
createdAt: feed.createdAt.toISOString(),
description: feed.description,
displayName: feed.displayName,
fields: feed.fields.map(field => {
return {
name: field.name,
value: field.value
}
}),
followersCount: feed.followersCount,
followingCount: feed.followingCount,
statusesCount: feed.statusesCount,
lastStatusAt: feed.lastStatusAt?.toISOString() ?? null,
name: feed.name,
node: {
domain: feed.node.domain,
softwareName: feed.node.softwareName
},
type: feed.type,
url: feed.url
}
})
})
}
export default handleFeedSearch