import { $fetch } from 'ofetch' import { createError, defineEventHandler, getHeader, getCookie, getQuery } from 'h3' import { useRuntimeConfig } from '#imports' import { getTenantFromContext } from '../../utils/tenant' /** * 我的收藏(标书项目) * GET /api/tender/favorites?page=1&limit=12 * 代理到 mp-api /api/hjc/project-favorite/page;需登录态。 * * 约定:原样透传 ApiResult{code,message,data}。HTTP 状态码恒为 200, * 「未登录/token 失效」是 code=401、「无权限」是 code=403,前端必须按 code 判定; * 故这里**不能**只取 data,否则登录态失败会被误当成「没有收藏」。 * * 刻意**不转发**客户端的 sort/order:后端固定按收藏时间倒序,且会丢弃客户端排序 * (这个查询是连表,放行排序有歧义列的风险)。少转发一个参数就少一处「看起来能排序」的错觉。 */ export default defineEventHandler(async (event) => { const config = useRuntimeConfig() const ctx = getTenantFromContext(event, config) const cookieToken = getCookie(event, 'hjc_token') const auth = getHeader(event, 'authorization') || (cookieToken ? `Bearer ${cookieToken}` : null) const q = getQuery(event) try { return await $fetch('/hjc/project-favorite/page', { baseURL: config.public.modulesApiBase, headers: { TenantId: ctx.tenantId, ...(auth ? { Authorization: auth } : {}) }, query: { TenantId: ctx.tenantId, page: q.page, limit: q.limit } }) } catch (error: any) { throw createError({ statusCode: error?.statusCode || error?.response?.status || 502, statusMessage: error?.statusMessage || 'Failed to fetch my favorites' }) } })