67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
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 : "月销量接口调用失败");
|
||
}
|
||
}
|