fix: content API从实体表读取reviews/faq/gallery/stories/news/blog数据
这个提交包含在:
父节点
ab49633b81
当前提交
65d2512cb9
@ -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
|
||||
})
|
||||
|
||||
正在加载...
x
在新工单中引用
屏蔽一个用户