스킬 정리 및 리팩토링

This commit is contained in:
2026-02-26 09:05:17 +09:00
parent 4c52d6d82f
commit 406af7408a
71 changed files with 3776 additions and 3934 deletions

View File

@@ -0,0 +1,82 @@
import type { KisRuntimeCredentials } from "@/features/settings/store/use-kis-runtime-store";
import {
DOMESTIC_KIS_SESSION_OVERRIDE_HEADER,
DOMESTIC_KIS_SESSION_OVERRIDE_STORAGE_KEY,
parseDomesticKisSession,
} from "@/lib/kis/domestic-market-session";
export interface KisApiErrorPayload {
ok?: boolean;
message?: string;
error?: string;
errorCode?: string;
}
interface BuildKisRequestHeadersOptions {
jsonContentType?: boolean;
includeAccountNo?: boolean;
includeSessionOverride?: boolean;
}
/**
* @description KIS API 응답에서 사용자 노출용 에러 메시지를 추출합니다.
* @see features/trade/apis/kis-stock.api.ts 종목/주문 API 실패 처리
* @see features/dashboard/apis/dashboard.api.ts 대시보드 API 실패 처리
*/
export function resolveKisApiErrorMessage(
payload: unknown,
fallbackMessage: string,
) {
if (!payload || typeof payload !== "object") {
return fallbackMessage;
}
const response = payload as KisApiErrorPayload;
return response.message || response.error || fallbackMessage;
}
/**
* @description KIS API 호출용 공통 헤더를 생성합니다.
* @see features/dashboard/apis/dashboard.api.ts 잔고/지수/활동 조회 공통 헤더
* @see features/trade/apis/kis-stock.api.ts 종목/호가/차트/주문 공통 헤더
*/
export function buildKisRequestHeaders(
credentials: KisRuntimeCredentials,
options?: BuildKisRequestHeadersOptions,
) {
const headers: Record<string, string> = {
"x-kis-app-key": credentials.appKey,
"x-kis-app-secret": credentials.appSecret,
"x-kis-trading-env": credentials.tradingEnv,
};
if (options?.jsonContentType) {
headers["content-type"] = "application/json";
}
if (options?.includeAccountNo && credentials.accountNo.trim()) {
headers["x-kis-account-no"] = credentials.accountNo.trim();
}
if (options?.includeSessionOverride) {
const sessionOverride = readSessionOverrideForDev();
if (sessionOverride) {
headers[DOMESTIC_KIS_SESSION_OVERRIDE_HEADER] = sessionOverride;
}
}
return headers;
}
function readSessionOverrideForDev() {
if (typeof window === "undefined") return null;
try {
const raw = window.localStorage.getItem(
DOMESTIC_KIS_SESSION_OVERRIDE_STORAGE_KEY,
);
return parseDomesticKisSession(raw);
} catch {
return null;
}
}