import { $fetch } from 'ofetch' import { createError, defineEventHandler, getQuery } from 'h3' import { useRuntimeConfig } from '#imports' import { getTenantFromContext } from '../../utils/tenant' import { getTemplateCodeById } from '../../utils/template-map' /** * 获取站点信息 * GET /api/site/info * 代理到 CMS: /cms/cms-website/getSiteInfo * 返回站点基础信息 + 导航(topNavs/bottomNavs) + config + setting */ export default defineEventHandler(async (event) => { const config = useRuntimeConfig() const ctx = getTenantFromContext(event, config) const query = getQuery(event) const modulesApiBase = config.public.modulesApiBase as string try { const res = await $fetch('/cms/cms-website/getSiteInfo', { baseURL: modulesApiBase, headers: { TenantId: ctx.tenantId }, query }) // 回填模板标识 templateCode(与 SSR 中间件 tenant.ts 保持一致的口径): // 上游只返回 templateId 主键,而主键存在跳号错位风险,前端需按 code 解析模板目录。 const payload = (res as { data?: Record })?.data ?? (res as Record) if (payload && typeof payload === 'object' && !payload.templateCode && payload.templateId) { const code = await getTemplateCodeById(payload.templateId as number, config) if (code) payload.templateCode = code } return res } catch (error: any) { throw createError({ statusCode: error?.statusCode || error?.response?.status || 502, statusMessage: error?.statusMessage || 'Failed to fetch site info' }) } })