import Link from "next/link"; import { prisma } from "@/lib/prisma"; export default async function PromptsPage({ searchParams, }: { searchParams: Promise<{ query?: string; entity?: string; tag?: string; model?: string; sort?: "new" | "popular"; }>; }) { const sp = await searchParams; const query = (sp.query ?? "").trim(); const entity = (sp.entity ?? "").trim(); const tag = (sp.tag ?? "").trim(); const model = (sp.model ?? "").trim(); const sort = sp.sort === "popular" ? "popular" : "new"; const [entities, tags, models, prompts] = await Promise.all([ prisma.entity.findMany({ where: { isPublished: true }, orderBy: { name: "asc" }, take: 100, select: { slug: true, name: true }, }), prisma.tag.findMany({ orderBy: { name: "asc" }, take: 200, select: { slug: true, name: true }, }), prisma.promptModel.findMany({ orderBy: { name: "asc" }, take: 100, select: { slug: true, name: true, provider: true }, }), prisma.prompt.findMany({ where: { isPublished: true, ...(entity ? { entity: { slug: entity } } : {}), ...(model ? { model: { slug: model } } : {}), ...(tag ? { tags: { some: { tag: { slug: tag } } } } : {}), ...(query ? { OR: [ { title: { contains: query, mode: "insensitive" } }, { descriptionMd: { contains: query, mode: "insensitive" } }, ], } : {}), }, orderBy: sort === "popular" ? { likes: { _count: "desc" } } : { createdAt: "desc" }, take: 50, select: { id: true, title: true, descriptionMd: true, createdAt: true, entity: { select: { slug: true, name: true } }, model: { select: { slug: true, name: true, provider: true } }, tags: { select: { tag: { select: { slug: true, name: true } } } }, _count: { select: { likes: true, comments: true, bookmarks: true } }, }, }), ]); return (
모프
{prompts.length}개
{p.title}
{p.entity.name} {p.model ? ` · ${p.model.name}` : ""}
좋아요 {p._count.likes}
댓글 {p._count.comments}
북마크 {p._count.bookmarks}
{p.descriptionMd}
) : null} {p.tags.length ? (API
검색 API:{" "}
/api/prompts