Your Name 987ab3f6a0
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: support batch competitor planning lookup
2026-04-30 17:35:25 +08:00

55 lines
1.9 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import {
PRODUCT_PLANNING_ADVANCED_DISABLED,
PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE,
} from "@/lib/product-planning/advanced-disabled";
import { getResolvedProductPlanningApiConfig } from "@/lib/product-planning/server-config";
import {
isProductPlanningEnabled,
PRODUCT_PLANNING_DISABLED_MESSAGE,
} from "@/lib/product-planning/server-feature";
import { getProductPlanningToken } from "@/lib/product-planning/server-auth";
import { fetchProductPlanningJdItem } from "@/lib/product-planning/marketplace-items";
import type { ProductPlanningTaobaoItemResponse } from "@/lib/product-planning/types";
export const runtime = "nodejs";
function jsonError(status: number, error: string) {
const payload: ProductPlanningTaobaoItemResponse = {
success: false,
error,
};
return NextResponse.json(payload, { status });
}
export async function GET(request: NextRequest) {
if (PRODUCT_PLANNING_ADVANCED_DISABLED) {
return jsonError(503, PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE);
}
const token = await getProductPlanningToken(request);
if (!token?.sub) {
return jsonError(401, "未登录");
}
if (!(await isProductPlanningEnabled())) {
return jsonError(403, PRODUCT_PLANNING_DISABLED_MESSAGE);
}
const itemId = String(request.nextUrl.searchParams.get("id") || "").trim();
if (!itemId) {
return jsonError(400, "缺少商品ID参数");
}
const config = await getResolvedProductPlanningApiConfig();
try {
const item = await fetchProductPlanningJdItem(itemId, config);
return NextResponse.json({
success: true,
item,
} satisfies ProductPlanningTaobaoItemResponse);
} catch (error) {
console.error("[ProductPlanning][JdItem] request failed:", error);
return jsonError(502, error instanceof Error ? error.message : "京东商品详情接口调用失败");
}
}