import type { KisRuntimeCredentials } from "@/features/settings/store/use-kis-runtime-store"; import { resolveKisApiErrorMessage, type KisApiErrorPayload, } from "@/features/settings/apis/kis-api-utils"; import type { DashboardKisProfileValidateResponse, DashboardKisRevokeResponse, DashboardKisValidateResponse, DashboardKisWsApprovalResponse, } from "@/features/trade/types/trade.types"; interface KisApiBaseResponse { ok: boolean; message: string; } async function postKisAuthApi( endpoint: string, credentials: KisRuntimeCredentials, fallbackErrorMessage: string, ): Promise { const response = await fetch(endpoint, { method: "POST", headers: { "content-type": "application/json", }, body: JSON.stringify(credentials), cache: "no-store", }); const payload = (await response.json()) as T | KisApiErrorPayload; if (!response.ok || !payload.ok) { throw new Error(resolveKisApiErrorMessage(payload, fallbackErrorMessage)); } return payload as T; } /** * @description KIS API 키를 검증합니다. * @see app/api/kis/validate/route.ts */ export async function validateKisCredentials( credentials: KisRuntimeCredentials, ): Promise { return postKisAuthApi( "/api/kis/validate", credentials, "앱키 검증에 실패했습니다.", ); } /** * @description KIS 액세스 토큰을 폐기합니다. * @see app/api/kis/revoke/route.ts */ export async function revokeKisCredentials( credentials: KisRuntimeCredentials, ): Promise { return postKisAuthApi( "/api/kis/revoke", credentials, "API 토큰 폐기에 실패했습니다.", ); } /** * @description 웹소켓 승인키와 WS URL을 조회합니다. * @see app/api/kis/ws/approval/route.ts */ export async function fetchKisWebSocketApproval( credentials: KisRuntimeCredentials, ): Promise { const payload = await postKisAuthApi( "/api/kis/ws/approval", credentials, "웹소켓 승인키 발급에 실패했습니다.", ); if (!payload.approvalKey || !payload.wsUrl) { throw new Error(payload.message || "웹소켓 연결 정보가 누락되었습니다."); } return payload; } /** * @description 계좌번호를 검증합니다. * @see app/api/kis/validate-profile/route.ts */ export async function validateKisProfile( credentials: KisRuntimeCredentials, ): Promise { return postKisAuthApi( "/api/kis/validate-profile", credentials, "계좌 검증에 실패했습니다.", ); }