import type { DashboardKisRevokeResponse } from "@/features/trade/types/trade.types"; import { normalizeTradingEnv } from "@/lib/kis/config"; import { parseKisCredentialRequest, validateKisCredentialInput, } from "@/lib/kis/request"; import { revokeKisAccessToken } from "@/lib/kis/token"; import { hasKisApiSession } from "@/app/api/kis/_session"; import { createKisApiErrorResponse, KIS_API_ERROR_CODE, toKisApiErrorMessage, } from "@/app/api/kis/_response"; import { NextRequest, NextResponse } from "next/server"; /** * @file app/api/kis/revoke/route.ts * @description 사용자 입력 KIS API 키로 액세스 토큰을 폐기합니다. */ /** * @description KIS 액세스 토큰 폐기 * @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 createKisApiErrorResponse({ status: 401, code: KIS_API_ERROR_CODE.AUTH_REQUIRED, message: "로그인이 필요합니다.", tradingEnv, }); } const invalidMessage = validateKisCredentialInput(credentials); if (invalidMessage) { return createKisApiErrorResponse({ status: 400, code: KIS_API_ERROR_CODE.INVALID_REQUEST, message: invalidMessage, tradingEnv, }); } try { const message = await revokeKisAccessToken(credentials); return NextResponse.json({ ok: true, tradingEnv, message, } satisfies DashboardKisRevokeResponse); } catch (error) { return createKisApiErrorResponse({ status: 401, code: KIS_API_ERROR_CODE.UNAUTHORIZED, message: toKisApiErrorMessage(error, "API 토큰 폐기 중 오류가 발생했습니다."), tradingEnv, }); } }