79 lines
2.7 KiB
TypeScript
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;
|
|
}
|