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:
66
app/api/lotto/debug/route.ts
Normal file
66
app/api/lotto/debug/route.ts
Normal 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,
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user