100 行
3.0 KiB
JavaScript
100 行
3.0 KiB
JavaScript
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
|
|
|
|
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 siteData
|
|
})
|