2026-05-27 13:16:37 +08:00

67 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { NextRequest, NextResponse } from "next/server";
import { createLogger } from "@/lib/observability/logger";
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 { fetchProductPlanningMonthSale } from "@/lib/product-planning/marketplace-items";
import type { ProductPlanningMonthSaleResponse } from "@/lib/product-planning/types";
export const runtime = "nodejs";
const logger = createLogger("product-planning-month-sale-api");
function jsonError(status: number, itemId: string, error: string) {
const payload: ProductPlanningMonthSaleResponse = {
success: false,
itemId,
recentSales: null,
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();
if (!config.saleToken) {
return jsonError(500, itemId, "缺少商品策划工具销量 Token,请前往系统设置配置");
}
try {
const recentSales = await fetchProductPlanningMonthSale(itemId, config);
return NextResponse.json({
success: true,
itemId,
recentSales,
raw: null,
} satisfies ProductPlanningMonthSaleResponse);
} catch (error) {
logger.error("request_failed", error);
return jsonError(502, itemId, error instanceof Error ? error.message : "月销量接口调用失败");
}
}