diff --git a/server/api/content/[key].get.js b/server/api/content/[key].get.js index 9cb87ac..20376b9 100644 --- a/server/api/content/[key].get.js +++ b/server/api/content/[key].get.js @@ -1,22 +1,99 @@ -import { eq } from 'drizzle-orm' +import { eq, desc, asc } from 'drizzle-orm' import { useDB, schema } from '../../utils/db.js' +function buildFromEntityTable(db, key, siteData) { + switch (key) { + case 'reviews': { + const rows = db.select().from(schema.reviews) + .where(eq(schema.reviews.published, true)) + .orderBy(desc(schema.reviews.sortOrder)).all() + const items = rows.map(r => ({ + nickname: r.author, + rating: r.rating, + productVersion: r.title, + content: r.content, + travelDate: r.date, + verified: r.verified + })) + return { + summary: siteData?.summary || {}, + items + } + } + case 'faq': { + const rows = db.select().from(schema.faqs) + .where(eq(schema.faqs.published, true)) + .orderBy(asc(schema.faqs.sortOrder)).all() + const items = rows.map(r => ({ + question: r.question, answer: r.answer + })) + if (siteData?.categories) { + return { categories: siteData.categories, items } + } + return { categories: [{ name: '常见问题', items }] } + } + case 'gallery': { + const rows = db.select().from(schema.galleryItems) + .where(eq(schema.galleryItems.published, true)) + .orderBy(asc(schema.galleryItems.sortOrder)).all() + const works = rows.map(r => ({ + title: r.title, category: r.category, + location: r.location, description: r.description, + image: r.image, orientation: r.orientation + })) + return { + seo: siteData?.seo || {}, + intro: siteData?.intro || {}, + categories: siteData?.categories || [], + works + } + } + case 'stories': { + const rows = db.select().from(schema.stories) + .where(eq(schema.stories.published, true)) + .orderBy(desc(schema.stories.sortOrder)).all() + return rows.map(r => { + const s = { ...r } + try { s.sections = JSON.parse(r.sections) } catch {} + try { s.keyMoments = JSON.parse(r.keyMoments) } catch {} + return s + }) + } + case 'news': + case 'blog': { + const rows = db.select().from(schema.articles) + .where(eq(schema.articles.type, key)) + .orderBy(desc(schema.articles.createdAt)).all() + return rows.map(r => { + const a = { ...r } + try { a.tags = JSON.parse(r.tags) } catch {} + return a + }) + } + } + return null +} + +const ENTITY_KEYS = ['reviews','faq','gallery','stories','news','blog'] + export default defineEventHandler(async (event) => { const key = getRouterParam(event, 'key') - const db = useDB() + const item = db.select().from(schema.siteContent) + .where(eq(schema.siteContent.key, key)).get() + const siteData = item ? JSON.parse(item.data) : null - const item = db - .select() - .from(schema.siteContent) - .where(eq(schema.siteContent.key, key)) - .get() - - if (!item) { - throw createError({ statusCode: 404, message: `未找到配置项: ${key}` }) + if (ENTITY_KEYS.includes(key)) { + const result = buildFromEntityTable(db, key, siteData) + if (result) { + setHeader(event, 'Cache-Control', 'public, max-age=60') + return result + } } + if (!siteData) { + throw createError({ statusCode: 404, message: `未找到配置项: ${key}` }) + } setHeader(event, 'Cache-Control', 'public, max-age=60') - - return JSON.parse(item.data) + return siteData })