import type { DashboardKisValidateResponse } from "@/features/trade/types/trade.types"; import { normalizeTradingEnv } from "@/lib/kis/config"; import { parseKisCredentialRequest, validateKisCredentialInput, } from "@/lib/kis/request"; import { getKisAccessToken } from "@/lib/kis/token"; import { hasKisApiSession } from "@/app/api/kis/_session"; import { NextRequest, NextResponse } from "next/server"; /** * @file app/api/kis/validate/route.ts * @description 사용자 입력 KIS API 키를 검증합니다. */ /** * @description 액세스 토큰 발급 성공 여부로 API 키를 검증합니다. * @see features/settings/components/KisAuthForm.tsx */ export async function POST(request: NextRequest) { const credentials = await parseKisCredentialRequest(request); const tradingEnv = normalizeTradingEnv(credentials.tradingEnv); const hasSession = await hasKisApiSession(); if (!hasSession) { return NextResponse.json( { ok: false, tradingEnv, message: "로그인이 필요합니다.", } satisfies DashboardKisValidateResponse, { status: 401 }, ); } const invalidMessage = validateKisCredentialInput(credentials); if (invalidMessage) { return NextResponse.json( { ok: false, tradingEnv, message: invalidMessage, } satisfies DashboardKisValidateResponse, { status: 400 }, ); } try { await getKisAccessToken(credentials); return NextResponse.json({ ok: true, tradingEnv, message: "API 키 검증이 완료되었습니다. (토큰 발급 성공)", } satisfies DashboardKisValidateResponse); } catch (error) { const message = error instanceof Error ? error.message : "API 키 검증 중 오류가 발생했습니다."; return NextResponse.json( { ok: false, tradingEnv, message, } satisfies DashboardKisValidateResponse, { status: 401 }, ); } }