57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
|
|
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<string, unknown>;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @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;
|
||
|
|
}
|