debug: NAS 엔드포인트 진단 라우트 추가 + purchase/analysis 원복

- /api/lotto/debug: NAS의 15개 경로 응답 상태를 일괄 점검
- purchase/analysis personal을 다시 NAS 기반으로 원복 (NAS에 데이터 보유)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-20 02:22:29 +09:00
parent 12c135ebd8
commit f8bfc74d02

View File

@@ -0,0 +1,66 @@
import { NextResponse } from 'next/server';
/**
* GET /api/lotto/debug
* NAS 엔드포인트 접근 가능 여부 일괄 진단
* 배포 후 브라우저에서 직접 호출: https://www.jaengseung-made.com/api/lotto/debug
*/
export async function GET() {
const base = process.env.NAS_LOTTO_API_URL;
if (!base) return NextResponse.json({ error: 'NAS_URL_NOT_CONFIGURED' }, { status: 500 });
const paths = [
// 현재 코드에서 호출 중인 경로들
'/api/lotto/recommend',
'/api/lotto/recommend/batch',
'/api/lotto/latest',
'/api/lotto/analysis',
'/api/lotto/simulation',
'/api/lotto/stats',
'/api/lotto/stats/performance',
'/api/lotto/report/latest',
'/api/lotto/report/history',
'/api/lotto/purchase',
'/api/lotto/purchase/stats',
'/api/lotto/analysis/personal',
'/api/history',
// NAS API 스펙 문서
'/openapi.json',
'/docs',
];
const results = await Promise.all(
paths.map(async (path) => {
const start = Date.now();
try {
const res = await fetch(`${base}${path}`, {
signal: AbortSignal.timeout(6000),
});
const ms = Date.now() - start;
let body: unknown = null;
try { body = await res.json(); } catch { /* ignore */ }
return { path, status: res.status, ok: res.ok, ms, body };
} catch (err) {
const e = err as { name?: string; message?: string; code?: string };
return {
path,
status: null,
ok: false,
ms: Date.now() - start,
error: e.code ?? e.name ?? e.message,
};
}
})
);
const ok = results.filter(r => r.ok);
const fail = results.filter(r => !r.ok);
return NextResponse.json({
base,
summary: { total: results.length, ok: ok.length, fail: fail.length },
ok: ok.map(r => ({ path: r.path, status: r.status, ms: r.ms })),
fail: fail.map(r => ({ path: r.path, status: r.status, error: (r as { error?: string }).error, ms: r.ms })),
full: results,
});
}