Files
goldenChart/frontend/src/utils/virtualTargetHydrate.ts
T

79 lines
2.7 KiB
TypeScript

/**
* 가상투자 — ui_preferences·앱 설정·서버 live-strategy 행 간 전략 ID 정합
*/
import { loadLiveStrategySettings, type LiveStrategySettingsDto } from './backendApi';
import type { VirtualSessionConfig, VirtualTargetItem } from './virtualTradingStorage';
import { resolveVirtualTargetStrategyId } from './virtualTargetStrategy';
/** 종목별 effective strategyId (ui → 세션 → 앱 전역 liveStrategyId) */
export function resolveVirtualTargetStrategyIdWithApp(
target: Pick<VirtualTargetItem, 'strategyId'>,
session: Pick<VirtualSessionConfig, 'globalStrategyId'>,
appLiveStrategyId: number | null | undefined,
): number | null {
return resolveVirtualTargetStrategyId(
target,
session.globalStrategyId,
appLiveStrategyId ?? null,
);
}
/** 세션 globalStrategyId — ui_preferences 비었을 때 앱 전역 liveStrategyId 로 복구 */
export function mergeVirtualSessionWithAppLive(
session: VirtualSessionConfig,
appLiveStrategyId: number | null | undefined,
): VirtualSessionConfig {
if (session.globalStrategyId != null) return session;
const sid = appLiveStrategyId;
if (sid == null || sid <= 0) return session;
return { ...session, globalStrategyId: sid };
}
function applyLiveRow(
target: VirtualTargetItem,
live: LiveStrategySettingsDto,
globalStrategyId: number | null,
appLiveStrategyId: number | null | undefined,
): VirtualTargetItem {
if (target.strategyId != null) return target;
const effective = resolveVirtualTargetStrategyIdWithApp(
target,
{ globalStrategyId },
appLiveStrategyId,
);
if (effective != null) return target;
const sid = live.strategyId;
if (sid == null || sid <= 0 || !live.isLiveCheck) return target;
return { ...target, strategyId: sid };
}
/** 서버 gc_live_strategy_settings — ui에 strategyId 없을 때 per-market 복구 */
export async function mergeTargetsWithLiveStrategySettings(
targets: VirtualTargetItem[],
session: VirtualSessionConfig,
appLiveStrategyId: number | null | undefined,
): Promise<VirtualTargetItem[]> {
if (targets.length === 0) return targets;
const globalId = session.globalStrategyId;
const merged = await Promise.all(
targets.map(async t => {
const effective = resolveVirtualTargetStrategyIdWithApp(
t,
session,
appLiveStrategyId,
);
if (effective != null) return t;
try {
const live = await loadLiveStrategySettings(t.market);
return applyLiveRow(t, live, globalId, appLiveStrategyId);
} catch {
return t;
}
}),
);
const changed = merged.some((t, i) => t.strategyId !== targets[i]?.strategyId);
return changed ? merged : targets;
}