Files
NianAIGC/app/api/admin/billing/prices/[id]/route.ts

46 lines
2.3 KiB
TypeScript

import { jsonError, jsonOk, readJsonBody } from "@/lib/server/api";
import { requireSuperAdminSession } from "@/lib/server/auth/current-user";
import { getBillingPriceRule, updateBillingPriceRule, updateBillingPriceTierMultiplier } from "@/lib/server/billing-store";
export const runtime = "nodejs";
export async function PATCH(request: Request, context: { params: Promise<{ id: string }> }) {
try {
await requireSuperAdminSession();
const { id } = await context.params;
const body = await readJsonBody<Record<string, unknown>>(request);
const unsupportedFields = Object.keys(body).filter((key) => !["markupMultiplier", "dimensionKey", "tierValue"].includes(key));
if (unsupportedFields.length) throw badRequest("平台标准价格与参数由系统维护,超管仅可调整上浮倍率。");
const multiplier = Number(body.markupMultiplier);
if (!Number.isFinite(multiplier) || multiplier < 1 || multiplier > 1000) {
throw badRequest("上浮倍率必须在 1.00 至 1000.00 之间。");
}
const dimensionKey = typeof body.dimensionKey === "string" ? body.dimensionKey.trim() : "";
const tierValue = typeof body.tierValue === "string" ? body.tierValue : "";
if ((dimensionKey && !tierValue) || (!dimensionKey && tierValue)) {
throw badRequest("参数档位倍率更新必须同时提供参数维度和档位。");
}
const existing = await getBillingPriceRule(id);
if (!existing) return jsonError("计费规则不存在", 404);
if (!dimensionKey && existing.parameterDimensions?.length) {
throw badRequest("当前服务包含参数档位,请指定要调整的参数档位倍率。");
}
const rule = dimensionKey || tierValue
? await updateBillingPriceTierMultiplier({
ruleId: id,
dimensionKey,
tierValue,
markupMultiplier: Number(multiplier.toFixed(4))
})
: await updateBillingPriceRule(id, { markupMultiplier: Number(multiplier.toFixed(4)) });
if (!rule) return jsonError("计费规则不存在", 404);
return jsonOk({ rule });
} catch (error) {
return jsonError(error, 500, { request, source: "api.admin.billing.prices.updateMultiplier" });
}
}
function badRequest(message: string): Error & { status: number } {
return Object.assign(new Error(message), { status: 400 });
}