import { eq } from 'drizzle-orm' import { useDB, schema } from '../../../utils/db.js' import { requireAdmin } from '../../../utils/auth.js' /** * 从 site_content JSON 数组中读取单个条目 * GET /api/admin/site-content/item?key=products&path=versions&index=0 */ export default defineEventHandler(async (event) => { requireAdmin(event) const query = getQuery(event) const { key, path, index } = query if (!key) throw createError({ statusCode: 422, message: 'key 参数必填' }) const db = useDB() const row = db.select().from(schema.siteContent).where(eq(schema.siteContent.key, key)).get() if (!row) throw createError({ statusCode: 404, message: '未找到配置' }) const data = JSON.parse(row.data) // 如果指定了 path,在嵌套对象中取数组 let arr = data if (path) { arr = path.split('.').reduce((obj, k) => obj?.[k], data) } if (!Array.isArray(arr)) { throw createError({ statusCode: 422, message: `${path || 'root'} 不是数组` }) } if (index !== undefined) { const idx = Number(index) if (idx < 0 || idx >= arr.length) throw createError({ statusCode: 404, message: '索引超出范围' }) return { item: arr[idx], index: idx, total: arr.length } } // 不传 index 就返回列表概要(只取关键字段,不返回大块内容) const items = arr.map((item, i) => ({ _index: i, id: item.id || '', name: item.name || item.title || '', tag: item.tag || item.line || '', days: item.days || '', nights: item.nights || '', subtitle: item.subtitle || '', audience: item.audience || '', })) return { items, total: arr.length } })