40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
/**
|
|
* 전략 ID → 이름 해석 (목록에 없거나 삭제된 전략 포함)
|
|
*/
|
|
import { loadStrategyForNotification, type StrategyDto } from './backendApi';
|
|
import { isStrategyMissingOnServer } from './strategyMissingCache';
|
|
|
|
/** 전략 목록 + 누락 ID별 단건 조회로 이름 맵 보강 */
|
|
export async function enrichStrategyNameMap(
|
|
base: Record<number, string>,
|
|
ids: Iterable<number | null | undefined>,
|
|
): Promise<Record<number, string>> {
|
|
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<number, string> {
|
|
const out: Record<number, string> = {};
|
|
for (const s of list) {
|
|
if (s.id != null && s.id > 0 && s.name?.trim()) {
|
|
out[s.id] = s.name.trim();
|
|
}
|
|
}
|
|
return out;
|
|
}
|