/** * 가상투자 — 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, session: Pick, 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 { 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; }