import { $fetch } from 'ofetch' import { createError, defineEventHandler, getQuery } from 'h3' import { useRuntimeConfig } from '#imports' import { getTenantFromContext } from '../../utils/tenant' /** * 父栏目聚合子栏目单页 * GET /api/page/children?navigationIds=1,2,3 * * 场景:父级 page 栏目(model=page)自身通常无内容,其下挂多个子 page 栏目。 * 访问父栏目时,前端递归收集父栏目自身 + 所有后代 navigationId,以逗号串传入, * 后端按 navigation_id IN (...) 一次性取回该父栏目下所有单页。 * * 代理到 SaaS 后端:/cms/cms-page/page?navigationIdsStr=...&status=1 * 仅返回已发布(status=1)的单页,避免泄露草稿/已下线内容。 * * 返回结构(与 /api/case/list 对齐,前端直接读 data.value?.list): * { list: CmsPage[], count: number } */ export default defineEventHandler(async (event) => { const config = useRuntimeConfig() const ctx = getTenantFromContext(event, config) const query = getQuery(event) const modulesApiBase = config.public.modulesApiBase as string const navigationIds = query.navigationIds as string | undefined if (!navigationIds) { return { list: [], count: 0 } } try { const res = await $fetch('/cms/cms-page/page', { baseURL: modulesApiBase, headers: { TenantId: ctx.tenantId }, query: { navigationIdsStr: navigationIds, // C 端只展示已发布单页:status 0草稿 1已发布 2已下线 status: 1, page: 1, limit: 100, TenantId: ctx.tenantId } }) // 上游返回 {code, message, data: {list, count}} 包装层, // 去掉包装并把 list/count 透传给前端。 const envelopeData = (res && res.data !== undefined ? res.data : res) || {} const rawList = Array.isArray(envelopeData.list) ? envelopeData.list : [] const count = envelopeData.count ?? envelopeData.total ?? rawList.length return { list: rawList, count } } catch (error: any) { throw createError({ statusCode: error?.statusCode || error?.response?.status || 502, statusMessage: error?.statusMessage || 'Failed to fetch page children' }) } })