import { eq } from 'drizzle-orm' import { useDB, schema } from '../../../utils/db.js' import { requireAdmin } from '../../../utils/auth.js' /** * 更新 site_content JSON 数组中的单个条目 * PUT /api/admin/site-content/item * body: { key, path, index, item } */ export default defineEventHandler(async (event) => { requireAdmin(event) const body = await readBody(event) const { key, path, index, item } = body if (!key || index === undefined || !item) { throw createError({ statusCode: 422, message: 'key, index, item 参数必填' }) } 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) const idx = Number(index) // 定位到目标数组 if (path) { const keys = path.split('.') let parent = data for (let i = 0; i < keys.length - 1; i++) parent = parent[keys[i]] const lastKey = keys[keys.length - 1] if (!Array.isArray(parent[lastKey])) throw createError({ statusCode: 422, message: 'path 不是数组' }) if (idx < 0 || idx >= parent[lastKey].length) throw createError({ statusCode: 404, message: '索引超出范围' }) parent[lastKey][idx] = item } else { if (!Array.isArray(data)) throw createError({ statusCode: 422, message: 'root 不是数组' }) if (idx < 0 || idx >= data.length) throw createError({ statusCode: 404, message: '索引超出范围' }) data[idx] = item } db.update(schema.siteContent) .set({ data: JSON.stringify(data), updatedAt: new Date().toISOString() }) .where(eq(schema.siteContent.key, key)) .run() return { success: true } })