fix(ui): проверять контекст расчёта OSPF оптимизатора

This commit is contained in:
Denozordec committed 2026-09-30 22:47:04 +07:00
1 parent f93dfe34c2
commit bf2815b5a4
9 files changed
+131 -108

No files matched your search

+14
View File
@@ -1,4 +1,5 @@
import {z} from "zod"
import {ospfOptimizeSchema} from "./ospf-response"
import {filtersResponseSchema} from "./filters-response"
const unique = <T,>(rows:T[],key:(row:T)=>string|number)=>new Set(rows.map(key)).size===rows.length
const measured = z.number().finite().nonnegative().nullable()
@@ -15,3 +16,16 @@ export const optimizerProbesSchema=z.object({probes:z.array(z.object({
lastPingRttMs:measured,lastPingLossPct:z.number().finite().min(0).max(100).nullable(),
lastTxAvgMbps:measured,lastRxAvgMbps:measured,lastPingAt:z.string().datetime({offset:true}).nullable(),
})).refine(rows=>unique(rows,row=>row.id))})
export const optimizerOspfPreviewSchema=z.object({
serverId:z.number().int().positive(),serverName:z.string(),pingWeight:z.number().int().min(0).max(100),
interfacesTotal:z.number().int().nonnegative(),changedCount:z.number().int().nonnegative(),unchangedCount:z.number().int().nonnegative(),
interfaces:ospfOptimizeSchema.shape.interfaces,changes:ospfOptimizeSchema.shape.interfaces,
}).refine(data=>{
const changed=data.interfaces.filter(row=>row.currentCost!==row.optimalCost)
return data.interfacesTotal===data.interfaces.length && data.changedCount===data.changes.length && data.unchangedCount===data.interfacesTotal-data.changedCount
&& new Set(data.interfaces.map(row=>row.id)).size===data.interfaces.length
&& new Set(data.changes.map(row=>row.id)).size===data.changes.length
&& changed.length===data.changes.length && changed.every(row=>data.changes.some(change=>JSON.stringify(change)===JSON.stringify(row)))
})
export type OptimizerOspfPreview=z.infer<typeof optimizerOspfPreviewSchema>