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