import type { DashboardKisWsApprovalResponse } from "@/features/trade/types/trade.types"; import { getKisApprovalKey, resolveKisWebSocketUrl } from "@/lib/kis/approval"; import { normalizeTradingEnv } from "@/lib/kis/config"; import { parseKisCredentialRequest, validateKisCredentialInput, } from "@/lib/kis/request"; import { NextRequest, NextResponse } from "next/server"; /** * @file app/api/kis/ws/approval/route.ts * @description KIS 웹소켓 승인키와 WS URL을 발급합니다. */ /** * @description 실시간 웹소켓 연결 정보를 발급합니다. * @see features/trade/hooks/useKisTradeWebSocket.ts */ export async function POST(request: NextRequest) { const credentials = await parseKisCredentialRequest(request); const tradingEnv = normalizeTradingEnv(credentials.tradingEnv); const invalidMessage = validateKisCredentialInput(credentials); if (invalidMessage) { return NextResponse.json( { ok: false, tradingEnv, message: invalidMessage, } satisfies DashboardKisWsApprovalResponse, { status: 400 }, ); } try { const approvalKey = await getKisApprovalKey(credentials); const wsUrl = resolveKisWebSocketUrl(credentials); return NextResponse.json({ ok: true, tradingEnv, approvalKey, wsUrl, message: "웹소켓 승인키 발급이 완료되었습니다.", } satisfies DashboardKisWsApprovalResponse); } catch (error) { const message = error instanceof Error ? error.message : "웹소켓 승인키 발급 중 오류가 발생했습니다."; return NextResponse.json( { ok: false, tradingEnv, message, } satisfies DashboardKisWsApprovalResponse, { status: 401 }, ); } }