/** * 전략 ID → 이름 해석 (목록에 없거나 삭제된 전략 포함) */ import { loadStrategyForNotification, type StrategyDto } from './backendApi'; import { isStrategyMissingOnServer } from './strategyMissingCache'; /** 전략 목록 + 누락 ID별 단건 조회로 이름 맵 보강 */ export async function enrichStrategyNameMap( base: Record, ids: Iterable, ): Promise> { const out = { ...base }; const missing = [...new Set( [...ids] .map(id => (id != null && id > 0 ? Math.trunc(id) : null)) .filter((id): id is number => id != null && !out[id] && !isStrategyMissingOnServer(id)), )]; if (!missing.length) return out; await Promise.all(missing.map(async id => { try { const s = await loadStrategyForNotification(id); if (s?.name?.trim()) out[id] = s.name.trim(); } catch { /* ignore */ } })); return out; } export function strategyNamesFromList(list: StrategyDto[]): Record { const out: Record = {}; for (const s of list) { if (s.id != null && s.id > 0 && s.name?.trim()) { out[s.id] = s.name.trim(); } } return out; }