import type { KisTradingEnv } from "@/features/trade/types/trade.types"; import { NextResponse } from "next/server"; export const KIS_API_ERROR_CODE = { AUTH_REQUIRED: "KIS_AUTH_REQUIRED", INVALID_REQUEST: "KIS_INVALID_REQUEST", CREDENTIAL_REQUIRED: "KIS_CREDENTIAL_REQUIRED", ACCOUNT_REQUIRED: "KIS_ACCOUNT_REQUIRED", UPSTREAM_FAILURE: "KIS_UPSTREAM_FAILURE", UNAUTHORIZED: "KIS_UNAUTHORIZED", } as const; export type KisApiErrorCode = (typeof KIS_API_ERROR_CODE)[keyof typeof KIS_API_ERROR_CODE]; interface CreateKisApiErrorResponseOptions { status: number; code: KisApiErrorCode; message: string; tradingEnv?: KisTradingEnv; extra?: Record; } /** * @description KIS API 라우트용 표준 에러 응답을 생성합니다. * @remarks 클라이언트 하위호환을 위해 message/error 키를 동시에 제공합니다. * @see features/trade/apis/kis-stock.api.ts 종목 API 클라이언트는 error 우선 파싱 * @see features/settings/apis/kis-auth.api.ts 인증 API 클라이언트는 message 우선 파싱 */ export function createKisApiErrorResponse({ status, code, message, tradingEnv, extra, }: CreateKisApiErrorResponseOptions) { return NextResponse.json( { ok: false, message, error: message, errorCode: code, ...(tradingEnv ? { tradingEnv } : {}), ...(extra ?? {}), }, { status }, ); } /** * @description unknown 에러 객체를 사용자 노출용 메시지로 정규화합니다. * @see app/api/kis/domestic/balance/route.ts 서버 예외를 공통 메시지로 변환 */ export function toKisApiErrorMessage(error: unknown, fallback: string) { return error instanceof Error ? error.message : fallback; }