import { $fetch } from 'ofetch' import { createError, defineEventHandler, getHeader, getCookie, getQuery } from 'h3' import { useRuntimeConfig } from '#imports' import { getTenantFromContext } from '../../utils/tenant' /** * 取消收藏(幂等) * DELETE /api/tender/favorites?projectId=123 * 代理到 mp-api /api/hjc/project-favorite/{projectId};需登录态。 * * 约定:原样透传 ApiResult{code,message,data}。后端**恒返回 code=0** * (本来就没收藏也算成功),结论在 data 里:`{ projectId, favorited: false }`。 * * projectId 走查询串而不是请求体:DELETE 带 body 在部分中间层会被丢掉, * 而它本来就是个标识符,放查询串更自然。 */ export default defineEventHandler(async (event) => { const config = useRuntimeConfig() const ctx = getTenantFromContext(event, config) const projectId = (getQuery(event) as any)?.projectId const cookieToken = getCookie(event, 'hjc_token') const auth = getHeader(event, 'authorization') || (cookieToken ? `Bearer ${cookieToken}` : null) if (!projectId) { throw createError({ statusCode: 400, statusMessage: '缺少 projectId' }) } try { return await $fetch(`/hjc/project-favorite/${projectId}`, { baseURL: config.public.modulesApiBase, method: 'DELETE', headers: { TenantId: ctx.tenantId, ...(auth ? { Authorization: auth } : {}) }, query: { TenantId: ctx.tenantId } }) } catch (error: any) { throw createError({ statusCode: error?.statusCode || error?.response?.status || 502, statusMessage: error?.statusMessage || 'Failed to remove favorite' }) } })