47 lines
1.6 KiB
TypeScript
47 lines
1.6 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { AdminAuthorizationError, requireAdminSession } from "@/lib/admin/auth";
|
|
import { adminErrorResponse } from "@/lib/admin/http";
|
|
import { epaySubmitUrl, readEpayConfig } from "@/lib/epay/config";
|
|
import { assertPublicGatewayUrl } from "@/lib/epay/gateway-policy";
|
|
|
|
export const runtime = "nodejs";
|
|
|
|
function reachableStatus(status: number) {
|
|
return status >= 200 && status < 500;
|
|
}
|
|
|
|
export async function POST() {
|
|
try {
|
|
await requireAdminSession("write");
|
|
const config = await readEpayConfig();
|
|
const submitUrl = epaySubmitUrl(config.gatewayUrl);
|
|
await assertPublicGatewayUrl(submitUrl);
|
|
const startedAt = performance.now();
|
|
let response = await fetch(submitUrl, {
|
|
method: "HEAD",
|
|
redirect: "manual",
|
|
signal: AbortSignal.timeout(8_000),
|
|
});
|
|
if (response.status === 405 || response.status === 501) {
|
|
response = await fetch(submitUrl, {
|
|
method: "GET",
|
|
redirect: "manual",
|
|
signal: AbortSignal.timeout(8_000),
|
|
});
|
|
}
|
|
const available = reachableStatus(response.status);
|
|
return NextResponse.json({
|
|
available,
|
|
message: available ? "当前已保存的易支付配置可访问" : "当前已保存的易支付配置暂不可用",
|
|
latencyMs: Math.round(performance.now() - startedAt),
|
|
status: response.status,
|
|
});
|
|
} catch (error) {
|
|
if (error instanceof AdminAuthorizationError) return adminErrorResponse(error);
|
|
return NextResponse.json({
|
|
available: false,
|
|
message: "当前已保存的易支付配置暂不可用",
|
|
});
|
|
}
|
|
}
|